C++面试问题汇总及解答(一)
-
C++中的多态的理解
从多态的分类来说,可以分为静态多态和动态多态。
静态多态也可以说是编译期多态,其特点就是在编译阶段就已经确定了函数的版本,静态多态的实现方法是:函数重载和函数模板的使用
动态多态可以称为运行期多态,在运行期才能确定运行的函数,实现方式是基类指针或者是基类引用指向一个派生类的对象
-
为什么C语言中没有函数重载?
编译器在编译期间创建的一个字符串,用来指明函数的定义和原型,C/C++程序的函数在内部使用不同的名字修饰方式,C的名字修饰更简单,只标明了函数名和函数参数的字节数,C++的名字修饰则包含了函数的调用方式,返回值类型,参数个数甚至参数类型
-
C++中的虚函数
虚函数是为了实现C++的运行多态而出现的,每个含有虚函数的类都会隐含一个虚函数表指针,指向一个虚函数表,虚函数表在编译过程中生成,且每一个类只有一个,虚函数表中只包含虚函数,虚函数按照声明顺序存在虚表中,在派生类中,前面是基类的虚函数,后面是派生类的虚函数
-
inline有什么用,什么时候编译?和宏定义的区别在哪里
inline关键字用来表示函数为内联函数,为了解决一些频繁调用的小函数大量消耗栈空间的问题
inline的使用是有所限制的,inline只适合函数体内简单的函数使用,不能包含复杂的结构控制语句,并且内联函数本身不能是递归的
inline函数仅仅是对编译器的一个建议,所以最后能否真正内联,看编译器的意思
定义在类中的成员函数默认都是内联的
关键字inline必须与函数定义体放在一起才能使函数成为内联,将inline放在函数声明前面不起任何作用
宏定义使用预处理器实现,只能实现一些简单的字符替换,不能进行参数有效性的检验,另外其返回值不能被强制转换为可转换的合适类型
宏定义在预处理阶段展开,inline在编译期间展开
-
C++的内存空间
C++的内存空间分为五个部分:静态存储区、栈区、堆区、文字常量区和程序代码区
静态存储区:在程序编译的时候分配好,且在程序的整个运行期间都存在,主要存放静态数据(局部static变量,全局static变量)全局变量和常量
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置与处理器的指令集中效率很高,但是分配到内存容量有限
堆区:亦称动态内存分配,程序在运行过程中使用malloc或new申请的内存,需要程序员在适当的时候释放,动态内存的生存期由程序员决定,如果不释放,则在程序结束时才会被释放
文字常量区:常量字符串的保存地,程序结束后由系统释放
程序代码区:存放函数体的二进制代码
-
lambda表达式
lambda定义了一个匿名函数,其底层是一个匿名的函数对象,使得代码更加灵活和简洁
典型的lambda函数由捕获列表,函数参数列表和函数体组成
捕获列表有按值捕获和按引用捕获两种
lambda的返回值类型一般可以省略,编译器会代为推理
-
const
const在*的左边,变量为const
const在*的右边,指针为const
类的成员函数后面加const表明这个函数不会对这个类的对象的数据成员作任何改变
常量对象可以调用const成员函数,而不能调用非const修饰的函数
const成员函数可以被对应的具有相同形参列表的非const成员函数承载。这种情况下类对象的常量性决定调用那个函数
const成员函数可以访问非const对象的非const数据成、const数据成员也可以访问const对象内的所有数据成员
非const成员函数只可以范文非const对象的任意数据成员
成员函数的const修饰的是this指针
-
如何让对象只分配在栈上
将new operator函数定义为private,或者定义为delete函数
-
内存池
程序频繁地在堆上分配和释放内存可能会导致性能地损失,为了解决这个问题,在真正使用内存之前,预先申请分配一定数量、大小预设的内存块留作备用,当产生内存需求时就从内存池中分出一部分内存块。
-
map和unorder_map的区别
map的底层实现是红黑树结构
unordered_map的底层是现实是哈希表 -
红黑树
红黑树的红节点表示的是节点与其子节点有一个左倾红链接
红黑树的是2-3-4树的一种实现。2-3-4树是阶数为4的B树
2-3-4树种的2节点对应红黑树中的黑色节点,非2节点以红节点加黑节点的方式存在,红节点的意义是与黑色父节点结合,表达着2-3-4树中的3,4节点
2-3树到红黑树的转化
2节点转换为黑节点、3节点转换为左倾红黑树,且红节点为子结点
定义:
1、节点颜色有红色和黑***r /> 2、根节点一定是黑***r /> 3、叶子节点一定是黑***r /> 4、不会有连续的红色节点
5、是一棵二叉查找树
红黑树的左旋可以将右倾转换为左倾
红黑树的颜色反转,将4节点降为三个2节点
- 为什么有了AVL还要红黑树
AVL树实现比较复杂,而且删除和插入性能差,AVL树每次插入和删除都需要计算每个节点左右子树的高度差,调整时需要进行很多的左旋或者右旋操作,而红黑树只需要通过判断颜色匹配规则然后进行简单的调整即可达到整棵树的平衡