美文网首页
2.C++面试问题汇总

2.C++面试问题汇总

作者: guanghaolv | 来源:发表于2020-08-06 00:06 被阅读0次

最近准备秋招,需要好好复习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进行重载,分配的内存为已有的栈上的内存,那new就可以不位于堆中,它在栈上。自由存储区是个抽象的概念,它可能在堆,也可能在栈。new的内存=自由存储区。

4.C和C++的区别

感觉这个没有一个标准的答案,感觉区别很大很多,又很细,所以此除只罗列几个吧

1.面向过程OR面向对象
  • C语言为面向过程编程语言;C+为面向对象编程语言;
2.关键字不同
  • C语言有32个关键字;C++98有63个关键字;
3.函数重载
  • C语言没有函数重载;C++支持函数重载。

5.C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)

联系:两者均为面向对象编程语言,都具有面向对象的特性,但是C++是对C的扩充,多少影响了面向对象,而Java比较彻底。
区别:

1.指针
  • C++具有指针,可以使用指针访问内存;Java中无法使用指针直接访问内存,增加了自动的内存管理功能,有效地防止了指针操作失误,如野指针;
2.多重继承
  • C++具有多重继承;Java不具有多重继承,但是可以继承多个接口,实现了多重继承的功能;
3.数据类型及类
  • C++中允许将函数和变量定义为类外;Java为完全面向对象的语言,所有函数和变量都是类或者类的一部分;
4.自动内存管理
  • C++中使用new动态管理内存时需要手动释放内存;Java自动进行内存回收操作,不需程序员操作;
5.操作符重载
  • C++支持操作符重载;Java不支持操作符重载;
6.预处理功能
  • C++有一个预编译阶段,支持预处理,虽然提供了方便,但是增加了编译的复杂度;Jav不支持预处理,但是提供的引入语句(import)和预编译的功能类似;
7.字符串
  • C++使用'\0'终止符代表字符串的结束;Java中字符串使用类对象来实现;
8.goto语句
  • C++支持goto语句,导致程序结构混乱,不易理解;Java虽然指定goto作为关键字,但是不支持它的使用;
9.类型转换
  • C++支持数据类型的隐式转换,比如float隐式转换为int;Java不支持隐式类型转换,必须显式进行强制类型转换;

6.struct和class的区别

1.默认继承和默认访问权限
  • struct为public,class为private;
2.模板
  • class可以定义模板类形参,而struct不可以。

7.define 和const的区别(编译阶段、安全性、内存占用等)

1.编译器处理方式
  • define在预处理阶段进行替换;const在编译时确定;
2.类型检查
  • define无类型,不进行安全检查,可能会产生意想不到的结果;const有数据类型,编译时会进行类型检查;
3.内存空间
  • define不分配内存,给出的是立即数,有多少次就进行多少次替换,在内存中有多个拷贝,消耗内存大;const分配内存(可能在全局静态区,也可能在栈区),在程序运行过程中只有一次拷贝;
4.其他
  • 在编译时,编译器通常不为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;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)

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++的四种强制转换

参考资料

1.守望者1208
2.浅谈new/delete和malloc/free的用法和区别

相关文章

  • 2.C++面试问题汇总

    最近准备秋招,需要好好复习C++语言了,准备看着别人面经里的问题复习,索性就记录下来,一是加深印象,另一个也可以供...

  • ROC-AUC 曲线以及PRC曲线

    目录:机器学习常见面试问题汇总问题汇总(1):逻辑回归问题汇总(2):支持向量机问题汇总(3):树模型问题汇总(4...

  • 问题汇总(5):神经网络

    这篇应当也是很重要的把~ 目录:机器学习常见面试问题汇总问题汇总(1):逻辑回归问题汇总(2):支持向量机问题汇总...

  • 面试问题(七)

    面试常见问题汇总 最后附上部分常见面试题汇总,虽然不能完全覆盖所有面试官的问题,但相信在思路和角度方面能够反映大部...

  • 问题汇总(6):EM算法

    这个现学现卖把,先把链接放上来: 目录:机器学习常见面试问题汇总问题汇总(1):逻辑回归问题汇总(2):支持向量机...

  • 问题汇总(3):树模型

    好,又来到一个重难点区域,前进! 目录:机器学习常见面试问题汇总问题汇总(1):逻辑回归问题汇总(2):支持向量机...

  • 问题汇总(7):朴素贝叶斯

    这个东西也是得好好搞清楚才行~ 目录:机器学习常见面试问题汇总问题汇总(1):逻辑回归问题汇总(2):支持向量机问...

  • iOS最新面试题汇总(四)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(三)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

  • iOS最新面试题汇总(一)

    iOS最新面试题汇总:iOS最新面试题汇总(一)iOS最新面试题汇总(二)iOS最新面试题汇总(三)iOS最新面试...

网友评论

      本文标题:2.C++面试问题汇总

      本文链接:https://www.haomeiwen.com/subject/nwparktx.html