引用来自“https://github.com/huihut/interview#data-structure”
1. const的作用
可修饰变量、指针、引用、类的成员函数,具体功能见原链接
const的指针里有顶层const和底层const之分,顶层const说明指针不可改变,底层const说明指针指向的值不可改变;
2. static的作用
可修饰普通变量、普通函数、成员变量、成员函数,作用各不相同,具体见原链接
3. this指针介绍一下
右值,不能取地址&this, 指向类内调用成员函数的对象, 成员函数调用时隐式使用this指针
4. inline内联函数介绍一下
相当于宏,但多了类型检查,具有函数特性,一般不包含循环、递归、switch等复杂操作,
在类声明中定义的函数自动隐式地当成内联函数处理;
相比宏函数的优缺点
#优点
提高运行速度,省去了参数压栈等函数操作
有安全检查和自动类型转换
可以访问类的成员变量
可调试
#缺点
代码膨胀
改变Inline函数需要重新编译
是否内联取决于编译器而不是程序员
5. 虚函数可以是内联函数吗?
可以,但虚函数表现多态性的时候不能内联,因为虚函数的多态性表现在运行期,只有编译器知道所调用的对象是哪个类才能内联,想想类声明中定义的内联虚函数;
6. volatile关键字起什么作用?
类型修饰符,用volatile声明的变量可以被编译器未知的因素(操作系统等)更改,
每次访问时都必须从内存中取值, const可以是volatile, 指针可以是volatile
7. assert()起什么作用?
宏,非函数,如果断言的条件为假,则程序终止运行,可以在源代码开头加入#define NDEBUG关闭断言
8. sizeof()起什么作用?
对数组返回数组所占空间的大小,对指针返回指针本身所占空间大小
9. #pragma pack(n)起什么作用?
设定结构体、联合以及类成员变量以n字节方式对齐, 大部分编译器会自动完成此功能
详见https://www.cnblogs.com/flyinggod/p/8343478.html
10. 位域(bit-fields)是什么?
用二进制位来表示变量,布局是大端还是小端与机器有关,
类型必须是整型或枚举;不能用取地址运算符&作用于位域
11. extern关键字的作用?
置于变量或函数前,表示该变量或函数在别的文件中定义
与static相反,static声明的变量表示只能在该文件中使用,extern声明的变量从别的文件中定义
extern "C" 声明的代码块让C++编译器按C语言代码处理
12. struct 和 typedef struct的区别
C中区别不大,C++中如果定义了struct __后的同名函数,则只表示函数而不是类
13. struct 和 class的区别?
默认访问控制,struct是public, class是private,
因此struct更适合看成一个数据结构的实现体,而class更适合看成一个对象的实现体;
14. union联合体介绍一下?
是一种节省空间的特殊的类,可以有多个数据成员,但是只有一个数据成员可以有值;
默认访问控制为public, 不含引用,不可继承,不可作为基类,不能有虚函数
15. explicit关键字的作用?
修饰构造函数式防止隐式转换和复制初始化,修饰转换函数时防止隐式转换(按语境转换除外)
16. friend友元类和友元函数的功能
访问私有成员,破坏封装性,友元关系不可逆、不可继承,友元声明的数量不受限制
17. using的作用
对命名空间权限管理, using namespace std;
类似typedef重命名,但是更直观, using INTptr = int*;
继承体系中改变继承的权限, using Base::func;
18. :: 范围解析运算符的作用
::前指明作用域的范围,可以是全局作用域(::前面什么都没有),类作用域(::前是类名),命名空间作用域;
19. decltype关键字的作用
用于检查实体的声明类型或表达式的类型及值分类, decltype(expr)
20. 左值引用(&)和右值引用(&&)
左值一般表示对象的身份,右值表示其值,
右值引用可以消除不必要的对象拷贝
21. 引用折叠是什么
X& &、X& &&、 X&& &,可以折叠成X&
X&& &&可折叠成X&&;
22. 宏是什么?
可以实现类似函数的功能,但实际上只是对参数的一对一替换
23. 成员初始化列表有什么好处?
高效,少了一次调用默认构造函数;
常量成员、引用类型、没有默认构造函数的情况下,必须使用初始化列表
24. initializer_list列表初始化
用花括号初始化器列表初始化一个对象,如vector
25. 面向对象三大特征是哪些?
封装、继承、多态
26. 什么是封装?
关键字public,protected,private, 把事物封装成抽象的类,并且将数据以不同访问权限隐藏
27. 什么是继承?
派生类(子类)继承基类(父类)的功能和成员
28. 什么是多态?
多种状态,可以理解为消息以多种形式显示的能力;多态以封装和继承为基础;
分编译期实现静态多态(重载,类模板,函数模板)和运行期实现动态多态(虚函数,自定义类型转换)的多态
静态函数、构造函数、普通函数(非类成员函数)不能是虚函数
29. 虚析构函数有什么作用?
析构函数可以是虚函数,用来解决用基类指针删除派生类对象;
30. 纯虚函数有什么作用?
在抽象类中无法给出有意义的实现的函数,留给派生类去实现,virtual A() =0
带纯虚函数的类叫抽象类
31. 虚继承解决了什么问题?
解决多继承条件下的菱形继承问题;一般通过虚基类指针和虚基类表实现;
虚基类在子类里存在拷贝,但是只有一份,因而解决了二义性和储存空间浪费的问题
32. 区分一下抽象类、接口类、聚合类?
抽象类:含有纯虚函数的类;
接口类:仅含有纯虚函数的抽象类;
聚合类:所有成员都是public,没有构造函数,没有类内初始化,没有基类和虚函数
33. new 和 delete具体做了什么?
new/new[],先底层调用malloc分配内存,然后调用构造函数
delete/delete[], 先调用虚构函数,然后底层调用free()释放空间
34. delete this合法吗?
合法,但必须保证delete this后面不再使用 this对象
35. 如何定义一哥只能在堆上(栈上)生成对象的类?
只能堆上(只能用new 动态构造),把析构函数设为private或Protected,
只能栈上(只能用 A a静态构造),把new,delete重载为private或protected
36. 智能指针是什么,怎么用?
头文件
shared_ptr, 智能指针可以共享同一个对象,最后一个指针自动销毁对象
weak_ptr, 允许共享但不拥有对象,一旦最后一个拥有对象的智能指针失去了所有权,任何weak_ptr都会自动成空(empty),可打破环状引用
unique_ptr, C++11才开始提供的类型,在异常时可以避免资源泄露,采用独占式拥有,一旦拥有者不再拥有该对象(销毁、空、或者拥有另一对象),先前拥有的对象就会自动销毁,取代auto_ptr;
37. 介绍一下有哪几种强制类型转换运算符
static_cast, 用于非多态类型,不执行检查,通常用于转换数值数据类型,可以在类层次结构中移动指针,向上转换安全
dynamic_cast, 用于多态类型,执行检查,只适用于指针或引用,可以在类层次结构中移动指针,包括向上转换、向下转换
const_cast,用于删除const,volatile的特性
reinterpret_cast, 允许将任何指针转换为其他指针类型和整数类型,不能丢掉const/volatile特性,一个实际用途是在哈希函数中
bad_cast, 由于强制转换拾贝,dynamic_cast引发的异常
引用来自“https://www.nowcoder.com/discuss/57942?type=all&order=time&pos=&page=2&channel=-2&source_id=search_all”
38. C与C++的区别(面向对象的特点),看25
39. 指针和引用的区别
引用是别名,指针是地址
40. 悬空指针和野指针有什么区别?
原来指向一个对象但是被回收的叫悬空指针(dangling pointer),没有初始化的指针叫野指针(wild pointer)
41. 什么是内存泄漏,怎么产生,如何检测?
申请了内存使用完毕后没有释放而被持续占用,
将分配内存的指针以链表的形式自行管理,使用完毕后删除;或者使用一些插件如leaky
42. static、const、define、struct、class、sizeof、strlen之间的联系与区别;
sizeof和strlen的区别在于一个是单目运算符一个是函数
43. 32位、64位系统中各种常用内置数据类型占用的字节数?
除了地址*和long类型岁系统位数增加而变大之外,其余基本相同
44. 函数指针的作用?由哪些属性唯一决定一个函数指针?
可以将函数作为参数传递给函数,
引用不在代码段中的函数;
45.C++中如何唯一确定一个重载函数?重载函数的默认初始化方式?
参数个数
46.C++多态的实现机制?虚函数表的内部实现机制?
运行时、编译时
每一个含有虚函数的类都有虚函数表,决定了执行成员函数的时候使用哪一个虚函数
47. C++重载、覆盖、隐藏的区别?
重载是函数名相同参数列表不同
覆盖(override)是基类虚函数在派生类中出现了同名函数,形参和返回类型相同函数体不同
隐藏(hide)局部变量或函数隐藏了全局变量或函数,或者覆盖的例子中形参或返回类型不同的同名函数会隐藏;
48. 深拷贝和浅拷贝的区别?
当拷贝对象中有指针或者引用成员时容易体现区别
49. 派生类中构造函数、析构函数调用顺序?
构造函数调用顺序同声明时基类的顺序,析构函数相反
50. C++类中数据成员初始化顺序?
先声明的先初始化,析构相反