作业:
1.什么是虚函数?什么是纯虚函数?
虚函数是指在基类中使用virtual关键字声明的成员函数,允许在派生类中重写。它支持多态性,使得通过基类指针或引用调用时,能够执行派生类的实现。
纯虚函数是虚函数的一种特殊形式,使用= 0进行声明,表示该函数在基类中没有实现,必须在派生类中实现。包含纯虚函数的类称为抽象类,抽象类是不能实例化对象的。
2.基类为什么需要虚析构函数?
基类需要虚析构函数的原因是为了确保在通过基类指针删除派生类对象时,能够正确调用派生类的析构函数,从而释放派生类中分配的资源。
如果基类的析构函数不是虚函数,删除派生类对象时只会调用基类的析构函数,导致派生类的析构函数不会被执行,可能会造成资源泄漏或未定义行为。
3.如何初始化 const和 static 数据成员?
const 数据成员必须在构造函数的初始化列表中进行初始化,不能在类体内直接赋值
static 数据成员可以在类体内声明,但必须在类外进行定义和初始化
4.指针和引用的区别
1> 引用定义时标识符是&,而指针定义时的标识符是*
2> 定义引用时,必须进行初始化,而定义指针时可以不用初始化
3> 没有空引用,但是可以有空指针
4> 引用一旦指定目标后,就不能进行修改了,而指针后期可以修改指向
5> 引用的使用跟目标一致,而指针的使用需要使用 *运算符
6> 引用就是目标本身,而指针记录的是目标的起始地址
7> 没有多级引用,但是有多级指针
8> 引用不占内存空间,使用的是目标的空间,而指针需要占内存空间
9> 引用的大小跟目标的大小保持一致,而指针的大小全部统一一致都是8字节(64位操作系统)
10> 引用在进行偏移时,就是对目标进行的偏移(如 ref++), 而指针的偏移,就是偏移目标单位内存空间的大小
11> 没有引用数组,但是可以定义指针数组
5.new和malloc的区别
1> malloc是标准库中提供的函数,属于函数调用,而new是C++中的关键字,无需开辟函数内存空间
2> malloc申请空间时,没有单个和连续空间的区别,而new申请时区分单个和连续空间的操作
3> malloc申请空间时,需要手动计算要申请空间的大小,而new申请空间时,会自动计算大小
4> malloc申请空间时,以字节为单位,而new申请空间时,以数据类型为单位
5> new申请空间时可以给空间进行初始化,而malloc不可以
6> malloc申请出的空间结果是void*类型,使用时需要根据具体的情况进行强转,而new申请空间时,申请什么类型的空间返回的就是什么类型的指针
7> new申请对象空间时,会自动调用该对象所在类中的构造函数,而malloc不会
8> 在new的底层实现中,还是调用了c语言中的malloc
6.内存泄漏怎么产生的?如何避免?
内存泄漏是指程序在动态分配内存后未能释放,导致无法再访问这些内存块,从而造成内存资源的浪费。常见的产生原因包括:
未释放动态分配的内存:使用new或malloc分配内存后,未调用delete或free释放。
丢失指针:在分配内存后,指针被重新赋值或超出作用域,导致无法访问原有内存。
异常处理:在异常发生时,未能释放已分配的内存。
如何避免:使用智能指针
7.C++的内存分区
代码区、数据区、堆区、栈区