【最全】C++面试题 (第一篇)

1.C++程序编译的过程

  1. 预处理:主要处理源代码文件中的以“#”开头的预编译指令。

  2. 编译:把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应 的汇编代码文件

  3. 汇编:将汇编代码转变成机器可以执行的指令(机器码文件),产生目标文件xxx.o(Linux 下)、xxx.obj(Window下)

  4. 链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。链接分为静态链接和动态链接。

  • 静态链接:将程序所需要的所有模块和库都拷贝到可执行文件中,使得可执行文件可以独立执行,不依赖于外部的模块或库。这种方式可执行文件的体积会比较大,而且如果多个程序依赖相同的目标文件,内存中会出现多个目标文件的副本。且更新困难(如果库中的内容被修改,需要重新编译、链接)。但是执行的速度比较快。

  • 动态链接:在程序运行时将所需要的模块和库文件动态的加载到程序中进行调用,操作系统会加载并链接所需的模块和库文件,将其映射到程序的内存空间中。这种方式可以减小可执行文件的体积,且多个程序依赖相同的库在执行时共享,即内存中只有一份。容易更新(更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍)。但是启动的速度稍慢,在运行时可能会因为找不到动态库或版本兼容问题出错。

2.C++中变量和对象的区别

  • 变量是用于存储数据的一种抽象概念,可以是基本数据类型或自定义数据类型(结构体),用于存储和操作数据。

  • 对象是指具有特定属性和行为的实体,是类的实例,由类定义的数据成员和成员函数组成。

3.C++中结构体是对象还是变量?

在C++中,结构体既可以是变量也可以是对象。结构体是一种自定义的数据类型,可以用来组合不同类型的数据成员。

  • 当结构体被定义为变量时,它只是一个占据一定内存空间的数据块,可以直接访问其成员变量。

  • 当结构体被定义为对象时,它不仅包含成员变量,还可以有成员函数和构造函数等。

总结来说,如果结构体中只有成员变量没有方法,那实例就是变量;既有成员变量又有方法,那实例就是对象

4.如果对STL容器进行深拷贝,那里面存储的元素是深拷贝吗

容器中存储的元素不会自动进行深拷贝。容器的深拷贝只会复制容器本身的结构,而不会复制容器中的元素。

如果想要进行深拷贝,需要手动对容器中的元素进行深拷贝。具体的复制方式取决于元素的类型。对于内置类型(如int、float等),简单的赋值即可完成深拷贝。对于自定义类型,你需要实现拷贝构造函数或者重载赋值运算符来进行深拷贝。

5.C++中有哪些异步操作

  • 创建线程:通过thread类创建线程,并使用std::async函数来实现异步操作。

  • 异步任务:可以使用C++11引入的std::async函数来创建异步任务。std::async函数会返回一个std::future对象,可以用来获取异步任务的结果。

  • 回调函数:当异步操作完成时,可以调用事先注册好的回调来处理结果。

  • 协程:C++20引入的概念,协程可以通过co_await关键字来挂起执行,并在某个条件满足时恢复执行。

6.C++中有哪些锁

  • 互斥锁:同一时刻只能有一个线程访问共享资源。

  • 读写锁:允许多个线程同时读取共享资源,但只允许一个线程同时写入共享资源,适用于读远多于写的情况。

  • 递归锁:允许同一线程多次对锁进行加锁操作

  • 条件变量:用于在线程间通信和同步

7.C++中继承怎么实现的?

子类通过继承父类的成员变量来访问父类的成员变量和方法(只能访问父类中的public和protected)。

继承之后子类的内存布局:

基类的成员变量排在前面,派生类的成员变量排在后面

8.C++中的封装、继承和多态怎么做的

  1. 封装(Encapsulation):封装是将数据和对数据的操作封装在一起,通过对外提供公共接口来控制对数据的访问。在C++中,使用类来实现封装。类将数据成员和成员函数封装在一起,通过访问修饰符(public、private和protected)来控制对成员的访问权限。

  2. 继承(Inheritance):继承是指一个类可以基于另一个类来创建。通过继承,子类(派生类)可以继承父类(基类)的成员变量和成员函数,并且可以添加自己的新成员变量和成员函数。继承可以实现代码的重用和扩展。

  3. 多态(Polymorphism):多态是指同一种类型的对象在不同的情况下表现出不同的行为。C++中的多态有两种表现形式,一种是静态的多态(编译时确定):通过函数重载和泛型编程(模板)实现;另一种是动态的多态(运行时确定,晚绑定),通过虚函数(virtual function)来实现。当基类的指针或引用指向派生类的对象时,可以通过调用虚函数来实现动态绑定,即在运行时确定要调用的函数。这样可以实现基类指针或引用调用派生类的函数,提高代码的灵活性和可扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值