C++面试题总结(仍在更新)

本文详细介绍了C++中的静态成员、const关键字的作用,内存对齐、指针与引用的区别,虚函数、内存池、this指针、内存泄漏及其处理,以及C++11的新特性,如智能指针和lambda函数等。
摘要由CSDN通过智能技术生成

语法问题

1.static的作用

修饰局部变量:原本被放在栈区的局部变量被放在了全局区,生命周期变长。

修饰全局变量:让变量无法被外部链接。

修饰函数:让函数无法被外部链接。

修饰成员变量:类内声明,类外初始化。没有this指针。多个类共享静态成员变量。可以被非静态成员函数访问。

类内:class Data{static int m;};

类外:int Data::m=0; 

修饰成员函数:类内声明,类外初始化。没有this指针,只能访问静态成员变量和其他静态成员函数。可以被非静态成员函数访问。

类内:class Student{static float average();};

类外:float Student::average(){if(count)return sum/count;};

2.const的作用

修饰局部变量:局部变量无法被修改。

常量指针:不能通过常量指针改变变量的值,但是可以通过其他方式来改变变量的值。

const int* p =&a;

指针常量:指针在前,常量符号在后。指针指向的方向无法改变。

int* const p=&a;

修饰成员变量:只能在构造函数中进行初始化。

修饰成员函数:只可读取成员变量,不可修改成员变量。

void test01()const

{

        cout<<"you can not change these things"<<endl;

}

3.在main执行前后可能执行的代码?

之前:

栈区:设置栈指针

局区:初始化静态变量,全局变量,全局对象等,未初始化的变量赋初值。全局对象中的构造函数。

__attribute((constructor))

将main函数的参数传递给main,如argc和argv。

之后:

全局区:静态对象的析构函数,全局对象的析构函数。

__attribute((destructor))

用atexit注册的函数

其他

1.C++和各语言对比

C++和python对比:

python是解释性语言,执行效率偏低,但是自带的库较多,多用于机器学习等操作。

C++是编译性语言,执行效率高,但库比较少,开发周期长。多用于追求效率的设备,如嵌入式等。语法不同。

虚函数/纯虚函数

1.虚函数的作用

虚函数的作用主要是为了实现多态,可以在基类中对函数进行声明,在子类中对函数进行重载。并且可以通过基类的指针调用与基类同名但不同功能的函数。

2.纯虚函数的作用

包含纯虚函数的类被称为抽象类,抽象类不能用于实例化对象。继承抽象类的子类必须对当中的纯虚函数进行重载

3.哪些函数不能是虚函数

构造函数:有了构造函数才有虚表指针,有了虚表指针才能调用虚函数。因此构造函数必须在虚函数之前调用。

内联函数:

静态函数:

友元函数:

普通函数:

二、结构体内存对齐问题?

三、指针和引用的区别

四、传递参数时的指针和引用?

七、指针数组、数组指针、指针函数、函数指针

八、new delete malloc free

九、new delete malloc free

十、new delete malloc free

十一、new delete malloc free

十二、new delete malloc free

十三、宏定义和函数

十四、宏定义和typedef

十五、变量声明和定义

十六、strlen和sizeof

十八、a和&a

十九到二十一、C++、python、C、Java的对比

二十二、struct和class

二十三、宏定义和const

二十五、顶层const和底层const

二十六、数组名和指针

二十七、final和override

二十八、拷贝初始化和直接初始化

二十九、初始化和赋值

三十、extern C

三十一、野指针和悬空指针

三十二、C和C++的类型安全

三十三、重载、重写、隐藏的区别

三十四、C++的几种构造函数

三十五、浅拷贝和深拷贝的区别

三十六、内联函数和宏定义的区别

三十七、类的访问权限和继承权限

三十八、大小端存储

三十九、volatile、mutable和explicit关键字的用法

四十、什么情况下会调用拷贝构造函数

四十一、new

四十二、异常处理

四十五、形参和实参

四十六、值传递、指针传递、引用传递的区别和效率

四十七、静态变量什么时候初始化

四十八、const关键字的作用有哪些

四十九、类的继承

五十、从汇编层解释引用

五十一、深拷贝和浅拷贝

五十二、new和malloc

53、delete p、delete [] p、allocator都有什么作用?

54、new和delete的实现原理, delete是如何知道释放内存的大小的?

55、malloc申请的存储空间能用delete释放吗?

56、malloc与free的实现原理?

57、malloc、realloc、calloc的区别

58、类成员初始化方式?构造函数的执行顺序 ?为什么用成员初始化列表 会快一些?

59、有哪些情况必须用到成员列表初始化?作用是什么?

60、C++中新增了string,它与C语言中的 char *有什么区别吗?它是如何 实现的?

61、什么是内存泄露,如何检测与避免

62、对象复用的了解,零拷贝的了解

63、介绍面向对象的三大特性,并且举例说明

64、成员初始化列表的概念,为什么用它会快一些?

65 、 C++ 的 四 种 强 制 转 换 reinterpret_cast/const_cast/static_cast /dynamic_cast

66、C++函数调用的压栈过程

67、写C++代码时有一类错误是 coredump ,很常见,你遇到过吗?怎么 调试这个错误?

68、说说移动构造函数

69、C++中将临时变量作为返回值时的处理过程

70、如何获得结构成员相对于结构开头的字节偏移量

71、静态类型和动态类型,静态绑定和动态绑定的介绍

72、引用是否能实现动态绑定,为什么可以实现?

73、全局变量和局部变量有什么区别?

74、指针加减计算要注意什么?

75、 怎样判断两个浮点数是否相等?

76、方法调用的原理(栈,汇编)

77、C++中的指针参数传递和引用参数传递有什么区别?底层原理你知道 吗?

78、类如何实现只能静态分配和只能动态分配

79、如果想将某个类用作基类,为什么该类必须定义而非声明?

80、 继承机制中对象之间如何转换?指针和引用之间如何转换?

81、知道C++中的组合吗?它与继承相比有什么优缺点吗?

82、函数指针?

83、说一说你理解的内存对齐以及原因

84、 结构体变量比较是否相等

85、 函数调用过程栈的变化,返回值和参数变量哪个先入栈?

86、define、const、typedef、inline的使用方法?他们之间有什么区别?

87、你知道printf函数的实现原理是什么吗?

88、为什么模板类一般都是放在一个h文件中

89、C++中类成员的访问权限和继承权限问题

90、cout和printf有什么区别?

91、重载运算符

92、当程序中有函数重载时,函数的匹配原则和顺序是什么?

93、定义和声明的区别

94、全局变量和static变量的区别

95、 静态成员与普通成员的区别是什么?

96、说一下你理解的 ifdef endif代表着什么?

97、隐式转换,如何消除隐式转换?

98、C++如何处理多个异常的?

99、如何在不使用额外空间的情况下,交换两个数?你有几种方法

100、你知道strcpy和memcpy的区别是什么吗?

101、程序在执行int main(int argc, char *argv[])时的内存结构,你了解 吗?

102、volatile关键字的作用?

103、如果有一个空类,它会默认添加哪些函数?

104、C++中标准库是什么?

105、你知道const char* 与string之间的关系是什么吗?

106~135、

内存管理

一、类的存储空间?

1.空类占用1个字节(不同编译器不同)

2.类的成员函数(除虚函数)不占用空间

3.类的静态成员变量不占用空间

4.虚函数占用8个字节(不管几个虚函数都只占用8个字节)

因此只需要计算各个变量(非静态成员)占用的空间和虚函数的空间。

二、C++的内存分区

1.栈区:由操作系统控制,存放局部变量,是连续的固定大小的内存,地址由高到低,分配效率比较高,可以动态分配和静态分配。

(机理:由一个链表记录空闲内存块的地址,申请时需要遍历链表,找到第一个大于申请空间的内存块。访问时需要先访问地址在访问内存。)

2.堆区:由程序员分配和释放,是不连续的内存,空间大小要大于栈区,地址由低到高,分配效率略低,只能动态分配,可能会产生碎片。

3.全局/静态存储区:存储全局变量和静态变量。

4.常量区:存储常量,不允许修改。

5.代码区:存储二进制代码。

三、什么是内存池,如何实现?

六、关于this指针

七、关于this指针

八、内存泄漏的后果?如何检测?解决方法?

九、delete this

十、delete this

十一、delete this

十四、this指针

C++11新标准

1、C++ 11有哪些新特性?

2、auto、decltype和decltype(auto)的用法

3、C++中NULL和nullptr区别

4、智能指针的原理、常用的智能指针及实现

5、说一说你了解的关于lambda函数的全部知识

6、智能指针的作用

7、说说你了解的auto_ptr作用

8、智能指针的循环引用

9、手写实现智能指针类需要实现哪些函数?

10、智能指针出现循环引用怎么解决?

其他问题

1、C++的多态如何实现

2、为什么析构函数一般写成虚函数

3、构造函数能否声明为虚函数或者纯虚函数,析构函数呢?

4、基类的虚函数表存放在内存的什么区,虚表指针vptr的初始化时间

5、模板函数和模板类的特例化

6、构造函数、析构函数、虚函数可否声明为内联函数

7、C++模板是什么,你知道底层怎么实现的?

8、构造函数为什么不能为虚函数?析构函数为什么要虚函数?

9、析构函数的作用,如何起作用?

10、构造函数和析构函数可以调用虚函数吗,为什么

11、构造函数、析构函数的执行顺序?构造函数和拷贝构造的内部都干了 啥?

12、虚析构函数的作用,父类的析构函数是否要设置为虚函数?

13、构造函数析构函数可否抛出异常

14、构造函数一般不定义为虚函数的原因

15、类什么时候会析构?

16、构造函数或者析构函数中可以调用虚函数吗

17、构造函数的几种关键字

18、构造函数、拷贝构造函数和赋值操作符的区别

19、拷贝构造函数和赋值运算符重载的区别?

20、什么是虚拟继承

21、什么情况会自动生成默认构造函数?

22、抽象基类为什么不能创建对象?

23、模板类和模板函数的区别是什么?

24、多继承的优缺点,作为一个开发者怎么看待多继承

25、模板和实现可不可以不写在一个文件里面?为什么?

26、将字符串“hello world”从开始到打印到屏幕上的全过程?

27、为什么拷贝构造函数必须传引用不能传值?

28、静态函数能定义为虚函数吗?常函数呢?说说你的理解

29、虚函数的代价?

30、说一说你了解到的移动构造函数?

31、 什么时候合成构造函数?都说一说,你知道的都说一下

32、那什么时候需要合成拷贝构造函数呢?

33、构造函数的执行顺序是什么?

34、一个类中的全部构造函数的扩展过程是什么?

35、哪些函数不能是虚函数?把你知道的都说一说

  • 19
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值