没有合适的资源?快使用搜索试试~ 我知道了~
C++面试八股文深度总结

温馨提示
根据自己备战22届秋招(斩获华为、荣耀、联发科、海康威视等offer)总结的相关知识,其中包括C++基础知识、操作系统、计算机网络、数据库等知识。希望对读者有帮助,助其在找工作的路上少走弯路,收获自己心仪的offer。
资源推荐
资源详情
资源评论









C++基础
1 C++特点
1. C++在C语言基础上引入了面对对象的机制,同时也兼容C语言。
2. C++有三大特性(1)封装。(2)继承。(3)多态;
3. C++语言编写出的程序结构清晰、易于扩充,程序可读性好。
4. C++生成的代码质量高,效率高,
5. C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、
const_cast、reinterpret_cast)、智能指针、try—catch等等;
6. C++可复用性高,C++引入了模板的概念,标准模板库STL(Standard Template Library)。
2 说说C语言和C++的区别
1. C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、
auto变量等。
2. C++是面对对象的编程语言;C语言是面对过程的编程语言。
3. C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而
C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch
等等;
4. C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL。
C++的STL库相对于C语言的函数库更灵活、更通用。
3 说说 C++中 struct 和 class 的区别
1. struct 一般用于描述一个数据结构集合,而 class 是对一个对象数据的封装;
2. struct 中默认的访问控制权限是 public 的,而 class 中默认的访问控制权限是 private 的。
3. 在继承关系中,struct 默认是公有继承,而 class 是私有继承;
4. class 关键字可以用于定义模板参数,就像 typename,而 struct 不能用于定义模板参数,
4 include头文件的顺序以及双引号""和尖括号<>的区别
1. 区别:
(1)尖括号<>的头文件是系统文件,双引号""的头文件是自定义文件。
(2)编译器预处理阶段查找头文件的路径不一样。
2. 查找路径:
(1)使用尖括号<>的头文件的查找路径:编译器设置的头文件路径-->系统变量。
(2)使用双引号""的头文件的查找路径:当前头文件目录-->编译器设置的头文件路径-->系统变
量。
5 说说C++结构体和C结构体的区别
区别:
(1)C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。
(2)C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。
(3)C语言的结构体是不可以继承的,C++的结构体可继承。
(4)C 中使用结构体需要加上 struct 关键字,而 C++ 中可以省略 struct 关键字直接使用。
1. C++ 中的 struct 是对 C 中的 struct 进行了扩充,它们在声明时的区别如下:

C C++
成员函数 不能有 可以
静态成员 不能有 可以
访问控制 默认public,不能修改 public/private/protected
继承关系 不可以继承 可从类或者其他结构体继承
初始化 不能直接初始化数据成员 可以
6 导入C函数的关键字是什么,C++编译时和C有什么不同?
1. 关键字:在C++中,导入C函数的关键字是extern,表达形式为extern “C”, extern "C"的主要作
用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代
码按C语言的进行编译,而不是C++的。
2. 编译区别:由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译
后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带
上函数的参数类型,一般只包括函数名。
7 C++从代码到可执行二进制文件的过程
C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接。
预编译:这个过程主要的处理操作如下:
将所有的#define删除,并且展开所有的宏定义
处理所有的条件预编译指令,如#if、#ifdef
处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。
过滤所有的注释
添加行号和文件名标识。
编译:这个过程主要的处理操作如下:
词法分析:将源代码的字符序列分割成一系列的记号。
语法分析:对记号进行语法分析,产生语法树。
语义分析:判断表达式是否有意义。
代码优化。
目标代码生成:生成汇编代码。
目标代码优化。
汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。
链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。
链接分为静态链接和动态链接。
静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去
把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下
以.a为后缀。
动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函
数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程
序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

8 说说 static关键字的作用
1. 定义全局静态变量和局部静态变量:初始化的静态变量会在数据段分配内存,未初始化的静态变量
会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。
2. 定义静态函数:静态函数只能在本源文件中使用;如 static void func();
3. 定义静态变量。静态变量只能在本源文件中使用;
4. 定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏
在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对
象。所有这些对象的静态数据成员都共享这一块静态存储空间。
5. 定义类中的静态成员函数:如静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象
的静态数据成员都共享这一块静态存储空间。
此外:
当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成
员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针。既然它没有指向某一对象,也
就无法对一个对象中的非静态成员进行访问。
9 数组和指针的区别
1. 概念:
(1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。
(2)指针:指针相当于一个变量,它存放的是其它变量在内存中的地址。 指针名指向了内存的首
地址。
2. 区别:
(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝
(2)存储方式:
数组:数组在内存中是连续存放的,数组的存储空间,不是在静态区就是在栈上。
指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由
于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。
(3)求sizeof:
数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)
在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类
型是什么,sizeof(指针名)都是8。
10 说说什么是函数指针,如何定义函数指针,有什么使用场景
1. 概念:函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指
针所指向的地址。
2. 定义形式如下:
1. 函数指针的应用场景:回调(callback)。我们调用别人提供的 API函数(Application
Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫
Callback。
int func(int a);
int (*f)(int a);
f = &func;

11 静态变量什么时候初始化?
对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
而C++标准规定:全局或静态对象当且仅当对象首次用到时才进行构造。
12 nullptr调用成员函数可以吗?为什么?
能。
原因:因为在编译时对象就绑定了函数地址,和指针空不空没关系。
13 说说什么是野指针,怎么产生的,如何避免
1. 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
2. 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的
错误。这些我们都要注意避免。
3. 避免办法:
(1)初始化置NULL
(2)申请内存后判空
(3)指针释放后置NULL
(4)使用智能指针
14 说说静态局部变量,全局变量,局部变量的特点,以及使用场景
1. 首先从作用域考虑:C++里作用域可分为6种:全局,局部,类,语句,命名空间和文件作用域。
全局变量:全局作用域,可以通过extern作用于其他非定义的源文件。
静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。
局部变量:局部作用域,比如函数的参数,函数内的局部变量等等。
静态局部变量 :局部作用域,只被初始化一次,直到程序结束。
2. 从所在空间考虑:除了局部变量在栈上外,其他都在静态存储区。因为静态变量都在静态存储区,
所以下次调用函数的时候还是能取到原来的值。
3. 生命周期: 局部变量在栈上,出了作用域就回收内存;而全局变量、静态全局变量、静态局部变量
都在静态存储区,直到程序结束才会回收内存。
15 说说内联函数和宏函数的区别
区别:
1. 宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函
数压栈退栈过程,提高了效率;而内联函数本质上是一个函数,内联函数一般用于函数体的代码比
较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自
身。
2. 宏函数是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换 ;而内联函数则是
在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这
样可以省去函数的调用的开销,提高效率
3. 宏定义是没有类型检查的,无论对还是错都是直接替换;而内联函数在编译的时候会进行类型的检
查,内联函数满足函数的性质,比如有返回值、参数列表等。
内联函数使用的条件:
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果
执行函数体内代码的时间,相比于函数调用的开销较大,那么效率 的收获会很少。另一方面,每一

处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜
使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
内联不是什么时候都能展开的,一个好的编译器将会根据函数的定义体,自动地取消不符合要求的
内联。
17 说说new和malloc的区别,各自底层实现原理。
1. new是操作符,而malloc是函数。
2. new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数;而malloc没有构造函
数和析构函数。
3. malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大
小,返回指针不用强转。
4. new可以被重载;malloc不行
5. new分配内存更直接和安全。
6. new发生错误抛出异常,malloc返回null
malloc底层实现:当开辟的空间小于 128K 时,调用 brk()函数;当开辟的空间大于 128K 时,调用
mmap()。malloc采用的是内存池的管理方式,以减少内存碎片。先申请大块内存作为堆区,然后将
堆区分为多个内存块。当用户申请内存时,直接从堆区分配一块合适的空闲快。采用隐式链表将所有空
闲块,每一个空闲块记录了一个未分配的、连续的内存地址。
new底层实现:关键字new在调用构造函数的时候实际上进行了如下的几个步骤:
1. 创建一个新的对象
2. 将构造函数的作用域赋值给这个新的对象(因此this指向了这个新的对象)
3. 执行构造函数中的代码(为这个新对象添加属性)
4. 返回新对象
18 说说const和define的区别。
const用于定义常量;而define用于定义宏,而宏也可以用于定义常量。都用于常量定义时,它们的区别
有:
1. const生效于编译的阶段;define生效于预处理阶段。
2. const定义的常量,在C语言中是存储在内存中、需要额外的内存空间的;define定义的常量,运行
时是直接的操作数,并不会存放在内存中。
3. const定义的常量是带类型的;define定义的常量不带类型。因此define定义的常量不利于类型检
查。
19 说说C++中函数指针和指针函数的区别。
参考回答
1. 定义不同
指针函数本质是一个函数,其返回值为指针。
函数指针本质是一个指针,其指向一个函数。
2. 写法不同
3. 用法不同
用法参考答案解析
指针函数:int *fun(int x,int y);
函数指针:int (*fun)(int x,int y);
剩余177页未读,继续阅读
资源评论

- 太虚境游一场2023-09-08看了前面几段感觉看不下去了,首先常规new失败后是抛出异常,而不是像malloc类似返回值为空,对于new不应用返回值是否为空判断,其次在第13页的移动构造函数哪里是否是瞎写的,移动构造是存续将亡值的生命周期,使拷贝构造更高效,在移动构造扯隐式类型转换是否不合理,而且应避免隐式构造吧。
- HeartBiuBurn2023-03-04好好,学习了,对我很有用!
- weixin_473859622022-06-23总共有178页,看起来感觉不错
- icrad2022-06-08很好很强很细
- Jeremy_权2022-06-01这资料太顶了,强啊~

吾柳先生
- 粉丝: 39
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
