春招的时候,我自己整理了一份C++的面试重点,面试了七八家,发现基本没有超出这个范围的,可以说,背下本文的重点,对于想找一份C++开发工作的小伙伴来说,已经成功了一半。
本文除了帮助作者找到了大厂工作,还帮助我周围很多小伙伴拿下了心仪的offer,可以说目标不是大厂的小伙伴,只要把这些掌握了,拿一个二三线城市10k+,一线城市15k+的工作是没问题的。
本文篇幅较长,内容较长但都是精华,建议有需要的小伙伴收藏熟记!
本文针对于需求C++开发工作的小伙伴,整理了C++相关重点,本系列将持续更新,喜欢的小伙伴希望来个一键三连。
目录
-
- 你怎么理解C语言和C++的区别?⭐⭐⭐⭐⭐
- 一句话说明什么是面向对象思想⭐⭐⭐⭐⭐
- 简述下C++语言的特点⭐⭐⭐⭐
- C++的函数调用约定方式⭐⭐⭐⭐
- C++文件编译与执行的四个阶段⭐⭐⭐⭐
- 动态链接与静态链接?两者有什么区别⭐⭐⭐⭐
- 深拷贝和浅拷贝⭐⭐⭐⭐
- 指针和引用 ⭐⭐⭐⭐⭐
- Extern “C” ⭐⭐⭐
- C++的内存分区 ⭐⭐⭐⭐
- 堆和栈的区别⭐⭐⭐⭐
- 栈溢出的原因及解决办法⭐⭐⭐
- new和malloc有什么异同⭐⭐⭐⭐⭐
- 内存泄漏怎么产生的?如何避免?⭐⭐⭐⭐⭐
- 关键字static的作用⭐⭐⭐⭐⭐
- 为什么静态成员函数不能访问非静态成员⭐⭐⭐⭐⭐
- 静态成员函数与普通成员函数的区别⭐⭐⭐⭐⭐
- 静态局部变量,全局变量,局部变量的特点,以及使用场景⭐⭐⭐⭐
- const和define的区别⭐⭐⭐⭐⭐
- const的作用⭐⭐⭐⭐⭐
- 什么是宏?⭐⭐⭐⭐
- 为什么要少使用宏?C++有什么解决方案?⭐⭐⭐⭐⭐
- 结构体struct和共同体union(联合)的区别⭐⭐⭐
- c++中类和c语言中struct的区别(至少两点)⭐⭐⭐
- 重载overload,覆盖override,重写overwrite,这三者之间的区别⭐⭐⭐
- C++是不是类型安全的?⭐⭐⭐
- C++为什么用模板类,为什么用泛型⭐⭐⭐
- 什么是野指针⭐⭐⭐⭐
- 智能指针⭐⭐⭐⭐⭐
- 说几个C++11的新特性⭐⭐⭐
- 结语
你怎么理解C语言和C++的区别?⭐⭐⭐⭐⭐
1.C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等。
2.C++是面向对象的编程语言,C++引入了新的数据类型——类,由此引申出了三大特性(1)封装(2)继承(3)多态。而C语言则是面向过程的编程语言。
3.C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4.C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL(Standard Template Library)。STL的一个重要特点是数据结构和算法的分离,其体现了泛型化程序设计的思想。C++的STL库相对于C语言的函数库更灵活、更通用。
一句话说明什么是面向对象思想⭐⭐⭐⭐⭐
把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象抽象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch).
简述下C++语言的特点⭐⭐⭐⭐
1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
2、可以使用抽象数据类型进行基于对象的编程;
3、可以使用多继承、多态进行面向对象的编程;
4、可以担负起以模版为特征的泛型化编程。
C++与C语言的本质差别:在于C++是面向对象的,而C语言是面向过程的。或者说C++是在C语言的基础上增加了面向对象程序设。
C++的函数调用约定方式⭐⭐⭐⭐
1、__cdecl
__cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。由于由调用者清理栈,所以允许可变参数函数存在,如int sprintf(char* buffer,const char* format,…);。
2、__stdcall
__stdcall 很多时候被称为 pascal 调用约定。pascal 语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨。参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。
3、__fastcall
顾名思义,__fastcall 的特点就是快,因为它通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。
4、__thiscall
这是 C++ 语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this 指针存放于 ECX 寄存器,函数自身清理堆栈;如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理栈。__thiscall 不是关键字,程序员不能使用。参数按照从右至左的方式入栈。
C++文件编译与执行的四个阶段⭐⭐⭐⭐
1)预处理:根据文件中的预处理指令来修改源文件的内容
2)编译:编译成汇编代码
3)汇编:把汇编代码翻译成目标机器指令
4)链接:链接目标代码生成可执行程序
动态链接与静态链接?两者有什么区别⭐⭐⭐⭐
链接分为静态链接和动态链接。
1.静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。
2.而动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。
区别
1.静态链接是将各个模块的obj和库链接成一个完整的可执行程序;而动态链接是程序在运行的时候寻找动态库的函数符号(重定位)
2.静态链接运行快、可独立运行;动态链接运行较慢(事实上,动态库被广泛使用,这个缺点可以忽略)、不可独立运行。
3.静态链接浪费空间,存在多个副本,同一个函数的多次调用会被多次链接进可执行程序,当库和模块修改时,main也需要重编译;动态链接节省空间,相同的函数只有一份,当库和模块修改时,main不需要重编译。
深拷贝和浅拷贝⭐⭐⭐⭐
浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
指针和引用 ⭐⭐⭐⭐⭐
本质:
引用是别名,指针是地址
1.指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。
这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变&#