2.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就可以不位于堆中。

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;是否正确, 如果正确, 那么它调用了哪些函数?
这类题目更常见的是在基类和子类有不同实现方法。(虚函数相关,栗子很多,不多说了)

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的用法和区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值