文章目录
- 1.指针和引用的区别
- 2.堆和栈的区别
- 3.new和delete是如何实现的,new 与 malloc的异同处
- 4.C和C++的区别
- 5.C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
- 6.Struct和class的区别
- 7.define 和const的区别(编译阶段、安全性、内存占用等)
- 8.在C++中const和static的用法(定义,用途)
- 9.const和static在类中使用的注意事项(定义、初始化和使用)
- 10.C++中的const类成员函数(用法和意义)
- 11.计算下面几个类的大小:
- 12.给一个代码,求输出结果
- 13.C++的STL介绍(这个系列也很重要,建议侯捷老师的这方面的书籍与视频),其中包括内存管理allocator,函数,实现机理,多线程实现等
- 14.STL源码中的hash表的实现
- 15.STL中unordered_map和map的区别
- 16.STL中vector的实现
- 17.vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
- 18.C++中的重载和重写的区别:
- 19.C ++内存管理(热门问题)
- 20.介绍面向对象的三大特性,并且举例说明每一个。
- 21.多态的实现(和下个问题一起回答)
- 22.C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(热门,重要)
- 23.实现编译器处理虚函数表应该如何处理
- 24.析构函数一般写成虚函数的原因
- 25.构造函数为什么一般不定义为虚函数
- 26.构造函数或者析构函数中调用虚函数会怎样
- 27.纯虚函数
- 28.静态绑定和动态绑定的介绍
- 29.引用是否能实现动态绑定,为什么引用可以实现
- 30. 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
- 31.对象复用的了解,零拷贝的了解
- 32.介绍C++所有的构造函数
- 33.什么情况下会调用拷贝构造函数(三种情况)
- 34.结构体内存对齐方式和为什么要进行内存对齐?
- 35.内存泄露的定义,如何检测与避免?
- 36.手写实现智能指针类(34-37我没遇见过)
- 37.调试程序的方法
- 38.遇到coredump要怎么调试
- 39.内存检查工具的了解
- 40.模板的用法与适用场景
- 41.成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
- 42.用过C11吗,知道C11新特性吗?(有面试官建议熟悉C11)
- 43.C++的调用惯例(简单一点C++函数调用的压栈过程)
- 44.C++的四种强制转换
- 参考资料
最近准备秋招,需要好好复习C++语言了,准备看着别人面经里的问题复习,索性就记录下来,一是加深印象,另一个也可以供所有人参考。
1.指针和引用的区别
- 1.内存
指针占用内存空间;引用只是一个别名,不占内存空间; - 2.初始化
指针可以不初始化;引用必须初始化,不初始化会报错; - 3.指向
指针的指向可以变化,指向不同的对象;引用的指向不可以变化,从一而终; - 4.++操作
指针的++操作为地址的增加(增加指向类型的字节数);引用的++为指向变量的++操作; - 5.sizeof()
指针的sizeof()为指针变量(一个地址)的大小;引用的sizeof()为指向变量的大小; - 6.层级
指针有多级指针;引用只有1级
2.堆和栈的区别
- 1.管理方式
堆是程序员管理(new/delete,malloc/free);栈是编译器管理; - 2.空间大小
堆是一段不连续的内存空间(链表),大小受可用的虚拟内存影响,空间较大;栈是一段连续的空间大小,大小一般固定(1/2M),空间较小; - 3.分配方式
堆是动态分配,需手动释放;栈有静态分配和动态分配两种,静态分配(如临时变量,函数参数等)由编译器完成,动态分配(如alloca)由编译器自动释放; - 4.分配效率
堆的分配由库函数实现,机制复杂,因此效率较低;栈的分配在计算机底层提供支持,分配专门的寄存器存放栈地址,效率较高; - 5.生长方向
堆向上增长,地址越来越大;栈向下增长,地址越来越小; - 6.内存碎片
堆频繁的申请和释放内存会造成大量的内存碎片;栈是先进后出,不会造成内存碎片。
3.new和delete是如何实现的,new 与 malloc的异同处
- 1.new的实现
string* p=new string("hello");
new的实现
//1.分配内存
void* mem=operate new( sizeof(string) );
//2.转型
p=static_cast<string*>(mem);
//3.构造函数
p->string::string("hello");
- 2.delete的实现
delete p;
delete的实现
//1.析构函数
p->string::~string();
//2.释放内存
operate delete(p);
- 3.new 与 malloc的异同处
- 1.属性
new/delete是C++关键字,需要编译器支持。malloc/free是库函数,需要头文件支持c。 - 2.参数
使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。 - 3.返回类型
new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。 - 4.分配失败
new内存分配失败时,会抛出bac_alloc异常。malloc分配内存失败时返回NULL。 - 5.自定义类型
new会先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现)。
malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。 - 6.重载
C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc不允许重载。 - 7.内存区域
new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。
- 1.属性
4.C和C++的区别
5.C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
6.Struct和class的区别
7.define 和const的区别(编译阶段、安全性、内存占用等)
8.在C++中const和static的用法(定义,用途)
9.const和static在类中使用的注意事项(定义、初始化和使用)
10.C++中的const类成员函数(用法和意义)
11.计算下面几个类的大小:
class A {}; //sizeof(A) = 1;
class A { virtual Fun(){} }; //sizeof(A) = 4(32位机器)/8(64位机器);
class A { static int a; }; //sizeof(A) = 1;
class A { int a; }; //sizeof(A) = 4;
class A { static int a; int b; }; //sizeof(A) = 4;
12.给一个代码,求输出结果
class A
{
public:
A(int x){}
}
问:A a = 1;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)