面试题
1.什么是虚函数?什么是纯虚函数
在定义函数时前面加virtual。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函数;如果这个类定义了虚函数,那么在子孙类该函数也是虚函数,不需要加vartual。
纯虚函数是在虚函数头后加“ = 0”;包含纯虚函数的类称为抽象类,不能进行实例化。子类需要重写纯虚函数,不然也是抽象类
2.基类为什么需要虚析构函数
当基类的指针指向子类在堆区申请的空间时,申请空间先构造父类在构造子类。但delete父类指针时只能释放父类指针的作用域,不能完全释放子类空间,就会导致内存泄露。所以需要再定义析构函数前加virtual设置成虚析构函数。该类的子孙类也会是虚析构函数。
3.如何初始化const和static数据成员。
使用const必须对变量进行初始化,构造函数使用初始化列表来完成初始化;
static成员变量一般在类内声明,类外定义,没有给定初始值默认为0。
4.指针和引用的区别
1.指针使用*进行定义,引用使用&进行定义
2.引用没有多级引用,指针有多级指针
3.定义引用的时候必须初始化,定义指针的时候可以不初始化;
4.没有空引用,有空指针;
5.引用不能更改目标,指针在后面可以更改指向;
6.引用没有引用数组,指针有指针数组;
7.引用就是目标本身,指针是存储目标的首地址;
8.引用不占用内存空间,使用目标的内存空间,指针需要占用内存空间
9.使用引用是直接就可以使用,使用指针需要*运算符
10.引用偏移是目标本身的偏移,指针的偏移是目标内存空间的偏移
5.new和malloc的区别
1.malloc的函数调用需要开辟内存空间,new的关键字,不需要开辟函数内存空间;
2.malloc申请空间没有单个和连续的区分,new申请有单个和连续空间的区分
3.malloc申请空间要手动计算空间大小,new的系统自动计算大小
4.malloc申请空间以字节为单位,new申请空间以数据类型为单位
5.malloc申请的空间是void *类型,需要是要进行强转,new申请的什么类型返回的就是什么类型的指针
6.malloc申请空间不能初始化,new申请空间可以进行初始化
7.new申请空间自动调用该类的构造函数,malloc不会
6.内存泄露怎么产生的?怎么避免
当父类指针指向子类申请的空间,在delete父类指针时,只能释放父类指针作用域的空间,不能释放剩余的子类空间,就会导致内存泄露。所以需要在父类的析构函数前加virtual设置成虚析构函数。
7.C++的内存分区
分为堆区:动态分配内存区域,由new和delete操作。栈区:已经初始化的局部变量;静态区:未初始化的局部变量和全局变量
8.常用的数据结构有哪些?时间复杂度和空间复杂度如何使用
常用的有数组:时间复杂度:访问(O(1));插入/删除(O(n));空间复杂度(O(n))
链表:时间复杂度:访问(O(n));插入/删除(O(1))(位置已经知道);空间复杂度(O(n))
栈:时间复杂度:入栈/出栈(O(1));空间复杂度(O(n))
队列:时间复杂度:入队/出队(O(1));空间复杂度(O(n))
类:
思维导图