1、
1、什么是虚函数?什么是纯虚函数?
虚函数就是在基类中声明为 virtual的成员函数,允许在派生类中重写。
纯虚函数就是一个没有函数体额虚函数,在类声明中使用=0来特指它是纯虚函数
2、基类为甚么要虚析构函数?
虚析构函数:是用来解决当父类指针指向子类在堆区空间的对象时,
会先构造父类再把整个子类空间构造出来,
但是当要释放父类指针时只能释放父类空间的内容,
子类剩余的空间没办法释放所产生的内存泄漏问题。
3、如何初始化const和static数据成员
const修饰的成员变量必须在构造函数的初始化列表进行初始化工作,
因为他们在对象创建后就不能够被修改了。
static修饰的成员属于类而不是属于特定对象。
他们可以在类中声明,但是需要在类外进行初始化。
4、指针和引用的区别
指针和引用都是间接访问对象的一种方式
1、指针式用*来声明的,而引用时用&来声明的
2、指针声明时可以不进行初始化,而引用声明时必须初始化
3、指针的指向可以更改,而引用定义指向后就不能进行更改
4、指针储存的时变量的地址,而引用自身就是该变量
5、指针需要定义时需要额外的分配空间,引用不需要分配空间
6、没有多级引用,但是有多级指针
7、指针的偏移指的是空间大小的改变,引用的偏移就是对目标进行的改变
8、指针的储存空间大小统一都是8字节,引用的储存大小和目标一致
5、new和malloc的区别
1、malloc申请空间时调用函数来进行的,new只是关键字
2、malloc申请空间时候没办法进行初始化,new申请时可以初始化
3、malloc申请空间返回值时void类型,new申请返回值是按照申请空间时的类型
4、malloc申请空间不分单个和连续,new申请时则分单个和连续
5、malloc申请空间时按照字节大小为单位,new申请时是按照数据类型为单位
6、malloc申请空间是需要手动计算申请大小,new申请时是自动进行计算大小
6、内存泄漏是如何产生的?如何避免?
如何产生:
1、使用new或者malloc申请空间时,没有调用delete或free进行释放
2、父类指针调用子类函数时,结束后直接进行析构
解决:
1、每次申请空间后,结束时候要使用delete或free进行空间释放
2、在父类的析构函数采用虚析构函数
7、C++的内存分区
栈、怼、静态区、代码区、数据区
8、常用的数据结构有那些?时间复杂度和空间复杂度如何使用?
数组、链表、栈、队列、哈希表、二叉树、图
1、数组
时间复杂度:
访问:O(1)
插入:O(n)
空间复杂度:
O(n)
2、链表
时间复杂度:
访问:O(n)
插入:O(1)
空间复杂度:
O(n)
3、栈
时间复杂度:
访问:O(n)
push/pop:O(1)
空间复杂度:
O(n)
4、队列
时间复杂度:
访问:O(n)
enqueue:O(1)
空间复杂度:
O(n)
5、哈希表
时间复杂度:
访问:O(1)(平均)
空间复杂度:
O(n)
6、二叉树
时间复杂度
查找/插入/删除:O(n)(不平衡)
查找/插入/删除:O(log1)(平衡)
空间复杂度:
O(n)
2、思维导图