1.什么是虚函数?什么是纯虚函数?
虚函数:在函数名前加上virtual关键词修饰的函数是虚函数,在其后代类中被重写之后,可以实现多态特性,定义时会生成虚函数指针和虚函数列表,使用时会用虚指针遍历虚函数列表找到对应的虚函数,实现不同功能
纯虚函数:在虚函数的函数的函数体内不写或者无法写执行语句的函数,在函数末尾加上=0表示函数没有实现,需要注意的是,在继承其的子类中需要重写该虚函数
2.基类为什么需要虚析构函数?
在父指针实例化对象后,执行完操作释放父指针时,因为父指针作用域只有父类,所以只会析构父类,派生类的成员(子类自己的成员)无法释放,造成资源泄露,析构函数很好的避免了这一点,在析构时,能够正确释放空间。
3.如何正确初始化const和static数据成员?
const 数据成员要在类的构造函数中进行初始化,不能在类内部直接赋值。
static 数据成员要在类外进行定义和初始化。可以在类内部声明,但必须在类外提供定义。
4.指针和引用的区别?
1.初始化:定义引用时,必须进行初始化,而定义指针时可以不用初始化
2.标识符:引用定义时标识符是&,而指针定义时的标识符是*
3.值改变:引用一旦指定目标后,不能进行修改了,指针可以更改指向
4.是否可以为空:没有空引用,但是可以有空指针
5.使用方式:引用的使用与目标一致,指针的使用需要使用 *运算符
6.内存:引用不占内存空间,指针需要占内存空间(4/8)
7.多级:没有多级引用,但是有多级指针
8.本身:引用就是目标本身,指针记录的是目标的起始地址
9.值改变:引用在进行值改变时,就是对目标进行的值改变, 而指针的值改变,就是偏移地址(危险操作)
5.new和malloc的区别?
1.空间:malloc属于函数调用需开辟空间,new属于关键字不需要开辟空间
2.空间是否连续:malloc申请空间时,没有单个和连续空间的区别,而new申请时分单个和连续空间的操作
3.大小:malloc需要手动计算申请空间大小,new由系统自动计算
4.初始化:malloc申请空间时不可以可以给空间进行初始化,而new可以
5.返回值:malloc的返回值是void*类型,使用是需要强制转换,new不需要,类型与目标相同
6.内存泄漏是怎么产生的?如何避免?
内存释放时,没有释放该部分的内存,但是该内存下的程序已经结束,所以再也无法访问这部分内存,导致内存缩水。
使用异常处理函数抛出异常,及时处理问题
7.c++的内存分区
内核空间
栈空间 (函数运行空间,局部变量)
堆空间 (指针空间)
数 | .bss (未初始化的全局变量,static修饰的变量)
据 | .data (已初始化的全局变量,static修饰的变量)
区 | .ro (const修饰的常量和变量)
| .text (文本、代码段)
8.常用数据结构有哪些?时间复杂度和空间复杂度如何使用
堆、栈、队、链、二叉树、哈希表
时间复杂度 空间复杂度
堆 : O(1) O(n)
栈: O(n) O(n)
队: O(n) O(n)
链: O(n) O(n)
二叉树: O(log n)(最优) O(n)
哈希表: O(1)(最优) O(n)