继承和动态内存分配
假设基类使用了动态内存分配,而且定义了析构函数、复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数、复制构造函数和赋值函数。
当基类和派生类采用动态内存分配时,派生类的析构函数、复制构造函数、赋值运算符都必须使用相应的基类方法来处理基类元素。这种要求是通过三种不同的方式来满足的。对于析构函数。这是自动完成的,也就是说在派生类的析构函数中无需显示调用基类的析构函数。对于构造函数,这是通过在初始化成员列表中调用基类的复制构造函数来完成的,如果不这样做,将自动调用基类的默认构造函数,对于赋值运算符,这是通过使用域解析运算符显示地调用基类的赋值运算符来完成的。
编译器生成的成员函数
1、 默认构造函数
默认构造哈数要么没有参数,要么所有的参数都有默认值。如果没有定义任何构造函数,编译器将定义构造函数。另外,如果派生类构造函数的成员初始化列表中没有显示调用基类构造函数,则编译器将使用基类的默认构造函数来构造派生类对象的基类部分。在这种情况下,如果基类没有构造函数,将导致编译阶段错误。如果定义了某种构造函数,编译器将不会定义默认构造函数。在这种情况下,如果需要默认构造函数,则必须自己提供。(最好的建议就是,一旦自己定义了构造函数,那么最好再定义一个默认的构造函数,这样在别的子类中调用也非常的方便)
提供构造函数的动机之一是确保对象总能被正确地初始化。另外,如果类包含指针成员,则必须初始化这些成员。因此,最好提供一个显示默认构造函数,将所有的类数据成员初始化为合理的值。
2、 复制构造函数
复制构造函数接受其所属类的对象作为参数。在下述情况下,将使用复制构造函数
将新对象初始化为一个同类对象
按值将对象传递给函数
函数按值返回对象
编译器生成临时对象
如果程序没有使用复制构造函数,编译器将提供原型,但不提供函数定义,否则,程序将定义一个执行成员初始化的赋值构造函数。也就是说,新对象的每个成员都被初始化为原始对象相应成员的值。如果成员为类对象,则初始化该成员时,将使用相应类的复制构造