c++面试一

1.#include使用

 在C/C++中,#include 预处理指令用于包含头文件,这些头文件通常包含了函数声明、宏定义以及其他的声明和定义。#include 指令后面跟着的文件名可以使用双引号 "" 或尖括号 <> 来指定,它们之间有一些区别。

  1. 双引号 ""
    • 当文件名被双引号 "" 括起来时,预处理器会首先在当前源文件所在目录下查找要包含的文件。
    • 如果在当前目录下找不到指定的文件,预处理器会继续在系统默认的头文件目录中查找(通常是编译器的包含目录)。
  2. 尖括号 <>
    • 当文件名被尖括号 <> 括起来时,预处理器会直接在系统默认的头文件目录中查找要包含的文件。
    • 它通常用于包含系统提供的标准库头文件或者其他全局可用的头文件。

2. 常量指针和指针常量的区别

        2.1 const的优点

        在C/C++中,宏定义使用 #define 来定义一个符号常量或者带参数的代码替换。宏定义在预处理阶段被简单地进行文本替换,它不会进行任何类型检查。这意味着在宏定义中,不会进行任何类型检查,而且宏定义的参数也不会进行类型检查。

2.2 常量指针和指针常量的区别

const修饰的变量不能作为左值,初始化完不能被修改。
const的编译方式不同,在c中const就是当作变量来编译生成指令的,c++中,所有出现const常量名字的地方,都被常量的初始化替换。

在c语言中,const修饰的量可以不用初始化(但是没啥意义) ,但也不是常量,叫做常变量 

在c++中,,const修饰的量必须初始化,叫做常量

C++/C中const的区别 - 不同初始化方式对C++中const量性质的影响_c const没有初始化-CSDN博客

3.  c++11的新特性

3.1 初始化列表
  • 初始化列表允许使用 {} 语法来初始化数组、容器和类对象。
  • 它提供了一种更简洁、一致的初始化方式,并且可以防止窄化转换。

3.2 auto关键字

3.3 decltype关键字

3.4 范围for循环

3.5 nullptr关键字

void fun(int x) {
    cout << x << endl;
}

void fun(int* p) {
    if (p != nullptr)
        cout << *p << endl;
}

int main() {
    fun(0);  // 在 C++98 中编译可能失败,存在二义性,但在 C++11 中编译为 fun(int)
    int* p = nullptr;  // 使用 nullptr 初始化空指针
    return 0;
}
3.6 lambda表达式

Lambda表达式是一种匿名函数,它允许我们在需要函数作为参数的地方以内联的方式定义函数。

3.7 智能指针

3.8 右值引用

        右值引用是C++11引入的特性,用于标识对临时对象(右值)的引用。它们通过 && 符号来声明,与左值引用 & 相对应。

        右值引用的主要目的是提高C++中的移动语义(Move Semantics),允许在不进行资源拷贝的情况下将临时对象的内容转移给另一个对象,从而提高性能和效率。

        右值引用通常与移动构造函数和移动赋值运算符一起使用,这些特殊的成员函数允许在对象之间转移资源而不是复制资源。这对于管理动态分配的内存和其他资源非常有用,因为它减少了不必要的内存分配和释放。

3.9 移动语义 以及 移动构造函数和移动赋值运算符

        移动语义是C++11引入的特性,它允许在不进行资源复制的情况下将资源从一个对象转移到另一个对象。这样做可以避免不必要的内存分配和释放,提高程序的性能和效率。移动语义通常与右值引用一起使用,用于转移临时对象的资源。

        移动构造函数和移动赋值运算符与传统的复制构造函数和赋值运算符类似,但是接受的参数是右值引用(&&),表示它们可以接受临时对象或将要销毁的对象。在移动语义中,资源的所有权从右值对象转移到目标对象,右值对象的状态通常被置为有效但不再拥有资源的状态,这样可以避免重复释放资源。

        在 C++ 中,std::move 并不是将左值直接转换为右值引用,而是将左值强制转换为右值。这是因为右值引用绑定到右值,而左值引用绑定到左值。当我们使用 std::move 将一个左值传递给一个函数时,我们实际上是告诉编译器:不要再将该左值视为一个左值,而是视为一个可以移动的右值,这样在特定的情况下可以调用移动构造函数或移动赋值运算符,以提高性能。

        但是,std::move 并不会将左值变成右值引用,因为这样的转换是不安全的。右值引用表示一个临时对象,它的生命周期通常很短,而左值是一个具有持久性的对象。如果我们将一个左值直接转换为右值引用,那么就会让这个左值变成了临时对象,这可能导致程序中的错误行为或潜在的安全问题。

  std::move 仅适用于左值,它并不会改变参数的类型,只是将其视为右值引用,从而触发移动构造函数或移动赋值运算符。

        移动构造函数和移动赋值运算符是类的特殊成员函数,它们用于实现移动语义。移动构造函数允许将资源从一个对象移动到另一个对象,而不是进行深度复制。移动赋值运算符执行类似的操作,允许在赋值操作中转移资源。这两个特殊成员函数通常使用右值引用参数来实现。

#include <iostream>
#include <vector>

class MyVector {
public:
    int size;
    int* data;

    // 构造函数
    MyVector(int s) : size(s), data(new int[s]) {
        std::cout << "Constructing MyVector of size " << size << std::endl;
    }

    // 移动构造函数
    MyVector(MyVector&& other) noexcept : size(other.size), data(other.data) {
        other.size = 0;
        other.data = nullptr;
        std::cout << "Moving resources from one MyVector to another" << std::endl;
    }

    // 析构函数
    ~MyVector() {
        delete[] data;
        std::cout << "Destroying MyVector" << std::endl;
    }
};

int main() {
    // 创建一个临时的MyVector对象
    MyVector temp(5);
    
    // 创建一个新的MyVector对象,并使用移动构造函数将资源从temp移动到vec
    MyVector vec(std::move(temp));

    // 这时temp的资源已经被移动到vec,temp不再拥有资源,其析构函数会被调用
    std::cout << "Size of temp: " << temp.size << std::endl; // 应该输出0

    // vec现在拥有temp之前的资源
    std::cout << "Size of vec: " << vec.size << std::endl; // 应该输出5

    return 0;
}
3.10引用折叠

        引用折叠是 C++ 中涉及引用的一种特殊规则,它是在模板类型推导、函数重载和类型别名中引入的。引用折叠的规则如下:

  1. 当一个模板参数被推导为一个引用类型时,引用折叠会发生。

  2. 如果一个模板参数被推导为一个左值引用类型(例如 T&),并且被另一个左值引用类型引用(例如 T&T&&),或者被右值引用类型引用(例如 T&&),那么两个引用会折叠成一个左值引用。

  3. 如果一个模板参数被推导为一个右值引用类型(例如 T&&),那么它不会和其他引用类型折叠,它仍然是一个右值引用。

        引用折叠的主要作用是在模板参数推导和函数重载中简化语言规范,同时保留引用类型的重要语义。它通常与移动语义和完美转发等技术结合使用,以提高代码的通用性和灵活性。

template<typename T>
void foo(T&& x) {
    // 在这里,T&& 可能是左值引用或右值引用,取决于传入参数的类型
}

int main() {
    int a = 5;
    foo(a); // T 被推导为 int&,引用折叠后为 int&
    foo(10); // T 被推导为 int,引用折叠后为 int&&
    return 0;
}
 3.11 完美转发

        完美转发是 C++11 引入的一种语言特性,用于在函数模板中保留参数的值类别(左值或右值),并将其传递给另一个函数,同时保留参数的引用性质(左值引用或右值引用)。

        在 C++ 中,通常情况下,函数参数传递可以分为值传递和引用传递两种方式。值传递会创建参数的副本,而引用传递会直接操作原始参数。然而,在某些情况下,我们希望在函数模板中将参数按照原始类型和引用性质传递给另一个函数,而不改变其类型或引用性质。

        完美转发允许我们在函数模板中按照参数的原始类型和引用性质将参数传递给另一个函数,而不会丢失信息或改变参数的类型。通常情况下,我们使用 std::forward 函数来实现完美转发。std::forward 是一个模板函数,它接受一个参数并将其按照其原始类型和引用性质转发给另一个函数。

#include <iostream>
#include <utility> // 包含 std::forward

// 目标函数,接受左值引用参数
void process(int& x) {
    std::cout << "Processing lvalue: " << x << std::endl;
}

// 目标函数,接受右值引用参数
void process(int&& x) {
    std::cout << "Processing rvalue: " << x << std::endl;
}

// 模板函数,实现完美转发
template<typename T>
void forwarder(T&& x) {
    process(std::forward<T>(x));
}

int main() {
    int a = 5;
    forwarder(a); // 调用 process(int&),传递左值引用参数
    forwarder(10); // 调用 process(int&&),传递右值引用参数
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/421685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis概述

三层架构 表现层&#xff1a;直接和前端交互&#xff0c;接受AJAX请求&#xff0c;返回json数据业务层&#xff1a;一是处理前端的请求&#xff0c;二是返回持久层获取的数据持久层(数据访问层)&#xff1a;直接操作数据库&#xff0c;完成CRUD&#xff0c;返回数据给业务层 …

Tomcat服务部署、优化

一 Tomcat的基本介绍 Tomcat概念 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。 当在一台机器上配置好Apache 服务器…

宋Pro 荣耀版10.98万元起,开启“清场”模式!

2024年3月1日&#xff0c;比亚迪荣耀全家桶再添大将&#xff0c;万众期待的宋Pro DM-i荣耀版以10.98万元起的价格震撼推出。新车共推出5款车型&#xff0c;官方指导价10.98万元——13.98万元&#xff0c;重新锚定A级SUV市场新价值&#xff0c;在该细分市场正式拉开“电比油低”…

鼠标失灵怎么办?电脑出现鼠标失灵的详细处理方法介绍

无论是笔记本电脑还是台式机电脑&#xff0c;鼠标是必不可少的外设之一&#xff0c;而我们在使用电脑的过程中&#xff0c;经常回遇到鼠标突然失灵了&#xff0c;不听使唤&#xff0c;控制不了&#xff0c;接下小编来与大家一起分享&#xff0c;遇到这种情况我们该怎么办 有时…

iconv 更改字符串编码操作

概要 在日常开发中&#xff0c;中文字符乱码是一个经常遇到的问题。在解决此问题时&#xff0c;遇到一个比较好用的字符串编码开源库&#xff0c;在此进行总结。 整体思路流程 iconv官网地址&#xff1a;http://www.gnu.org/software/libiconv/ 这里主要使用的相关接口&…

SpringBoot整合Redis及其持久化机制(二)

SpringBoot整合Redis及其持久化机制 1、Redis全局命令1.2、Redis事务 2、Redis持久化2.1、RDB方式2.1.1、客户端触发机制2.1.2、服务端触发机制2.2.3、配置生成快照名称和位置2.2.4、优点2.2.5、缺点 2.2、AOF方式2.2.1、优点2.2.2、缺点 2.3、RDB-AOF混合方式2.4、持久化机制的…

黑马JavaWeb课程中安装vue脚手架出现的问题

1 安装node.js 要想前端工程化&#xff0c;必须安装node.js&#xff0c;前端工程化的环境。 在成功安装node.js后&#xff0c; 修改全局包安装路径为Node.js安装目录&#xff0c; 修改npm镜像源为淘宝镜像源&#xff0c;这里出现第一个问题&#xff0c;视频中给的淘宝镜像为&…

element-plus表格合并

要实现这样的表格&#xff0c; 怎么做呢&#xff1f; 甚至是这种三级的呢&#xff1f; 官网的案例也是通过这个方法进行配置的&#xff0c;也就是说表格长什么样&#xff0c;关键在怎么处理的方法上。 这是官网的方法&#xff0c;可参考拓展&#xff1a; const arraySpanMeth…

sqllibs-第46关

从本关开始&#xff0c;我们开始学习order by 相关注入的知识。 尝试?sort1 desc或者asc&#xff0c;显示结果不同&#xff0c;则表明可以注入。&#xff08;升序or降序排列 sort1时是第一列Id sort2时是第二列 username sort3时是第三列 password 当sort4时报错 相当于使用or…

Redis 之六:Redis 的哨兵模式(Sentinel)

Redis 哨兵&#xff08;Sentinel&#xff09;模式是一种高可用性解决方案&#xff0c;用于监控和自动故障转移的集群系统。 在 Redis Sentinel 架构中&#xff0c;哨兵是一组运行在特殊模式下的 Redis 进程&#xff0c;它们可以监控一个或多个主从复制结构中的 Redis 主服务器以…

Java中封装的解析

在 Java 中&#xff0c;封装是一种将类的内部实现细节隐藏起来&#xff0c;只向外部暴露必要的接口的机制。这样可以提高代码的安全性、可维护性和可重用性。 封装的主要目的是保护类的内部状态不被外部直接访问&#xff0c;同时提供公共的方法来操作这些状态。通过封装&#…

什么是VR虚拟现实|虚拟科技博物馆|VR设备购买

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种通过计算机技术模拟出的一种全新的人机交互方式。它可以通过专门的设备&#xff08;如头戴式显示器&#xff09;将用户带入一个计算机生成的虚拟环境之中&#xff0c;使用户能够与这个虚拟环境进行交互…

什么是VR科学教育|VR数字文化遗产展示|VR设备

VR科学教育是指利用虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术在科学教育领域中进行教学和学习的方法。通过VR技术&#xff0c;学生可以沉浸在虚拟环境中&#xff0c;与三维模型互动&#xff0c;观察和探索科学现象&#xff0c;从而更加直观地理解…

亚信安慧AntDB:融合架构下的数据管理利器

AntDB的独特架构将集中式和分布式部署模式巧妙融合&#xff0c;为用户提供了全方位的数据管理解决方案。这种一站式的特性使得用户无需在不同系统间来回切换&#xff0c;极大地提高了工作效率。 AntDB同时具备集中式和分布式系统的优点&#xff0c;集中式架构拥有简单易用、管…

git遇到的报错

这是小编在gits所遇到的报错集合&#xff0c;可能不会包含大家的报错信息但是咱们可以在评论区留言共同收集git的报错信息以及解决方法&#xff01; SSL证书问题 解决办法&#xff1a;git命令下运行 git config --global http.sslVerify false 然后再进行重新clone代码 Git应…

css实现居中

基础代码&#xff1a; <div class"box"><div class"content"></div> </div> css实现居中的几种方式&#xff1a; 1、flex布局&#xff08;水平垂直&#xff09; .box {width: 200px;height: 200px;background-color: pink;disp…

通过SMI(MDC/MDIO)读取外部PHY寄存器

一、基础介绍&#xff1a; SMI&#xff1a;串行管理接口&#xff08;Serial Management Interface&#xff09;&#xff0c;也被称作MII管理接口&#xff08;MII Management Interface&#xff09;&#xff0c;包括MDC和MDIO两条信号线。 MDIO是一个PHY的管理接口&#xff0c…

babylonjs入门-方向光

基于babylonjs封装的一些功能和插件 &#xff0c;希望有更多的小伙伴一起玩babylonjs&#xff1b; 欢迎加群&#xff08;点击群号传送&#xff09;&#xff1a;464146715 官方文档 中文文档 案例传送门 懒得打字 粘贴复制 一气呵成 ​

JavaSE——常用API(2/3)-String使用时的注意事项、String的应用案例

目录 String使用时的注意事项 阅读程序并解答&#xff08;1&#xff09; 阅读程序并解答&#xff08;2&#xff09; String的应用案例 案例1 案例2 小结 String使用时的注意事项 String对象的内容不可改变&#xff0c;被称为不可变字符串对象。&#xff08;每次试图改变…

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…
最新文章