什么是虚函数,什么是纯虚函数
在类中定义函数前加上virtual,那么该函数就是虚函数;
其确保父子类中只有一个该函数;
其子类中如果未进行重写操作,则直接调用父类中的虚函数;
进行重写后则都调用虚列表中重写后的虚函数;
进行虚函数设置后,其后面的所有子类中的该函数都是虚函数。
纯虚函数是在基类中声明的虚函数,其在函数结尾加上 =0 ;声明之后所有子类中的该函数都为纯虚函数。
基类为什么需要虚析构函数
子类中调用虚函数后也要进行析构,基类中不虚析构函数,子类中的虚函数无法被析构。
如何初始化const和static数据成员
static:
定义变量的时候在其类型前加上static;
通常在类外部初始化;
const:
在定义变量时在其类型前,变量前加const;
也可以在类内进行函数声明时初始化;
指针和引用的区别
指针大小固定,引用的大小因引用对象的不同而不同;
指针的指向可以改变,引用对象之后就无法更改;
可以有多级指针,没有多级引用;
定义指针可以不初始化,定义引用必须初始化;
没有空引用,有空指针;
没有引用数组,但是有指针数组;
引用不占内存空间,指针占内存空间;
引用就是被引用的数据本身,指针则是其地址;
指针偏移是对其进行单位内存空间大小的偏移,引用直接对本身进行偏移。
new和malloc的区别
new在申请内存空间时会调用构造函数;
malloc会是调用系统中的函数,占用内存空间,new是关键字,无需开辟内存空间;
new会对申请的空间进行初始化,malloc不会;
malloc得手动给输入申请的空间大小,new会自动计算;
new申请空间时是以数据类型为单位的,malloc则是以字节为单位的;
malloc无连续申请和单个申请的区别,new分连续申请和单个申请;
malloc申请的空间类型是void *的,需要根据需求强转,new则是申请时什么类型 返回值就是什么类型。
内存泄漏怎么产生,如何避免
动态内存分配的内存未释放;
循环引用;
异常处理不当;
指针管理不当;
文件未关闭;
避免:
设置智能指针;
成对使用new/delete和malloc/free;
避免循环使用;
正确处理异常。
C++的内存分区
代码区;数据区(全局/静态储存区,常量储存区);堆;栈;命令行参数与环境变量。