2024/5/3学习笔记:派生类的默认成员函数

2024-05-04 09:08:41 浏览数 (2)

6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类 中,这几个成员函数是如何生成的呢?

一.构造函数

一般无参构造函数,以及全缺省构造函数和编译器生成的构造函数都叫做默认构造函数,

继承后,派生类里有了父类的成员,但没有实例化对象,也只是一个类而已,所以在用派生类实例化对象时也要创建父类来去实例化。

要明确的是,继承关系里,先有父类,派生类才能去继承,所以派生类的构造函数必须要遵守先父后子的原则,必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。

2.拷贝构造

派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。和构造函数原则一样,如果基类没有默认的拷贝构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。

二.赋值重载

派生类的operator=必须要调用基类的operator=完成基类的复制,如果没有,就要显示调用。此外,父类的赋值重载会和派生类的赋值重载构成隐藏,因此使用时要注意

三.析构函数

派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能 保证派生类对象先清理派生类成员再清理基类成员的顺序。

析构函数遵循的原则与构造函数相反,一个先父后子,一个先子后父.但与构造函数不同的是,不能在派生类的析构函数里显示调用,这样会违反先子后父的原则,所以编译器会在派生类的析构函数完成后会自动进行一次父类析构函数调用,保证派生类对象先清理派生类成员再清理基类成员的顺序.

但是因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲 解)。那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加 virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。

四.总结

构造函数的规则一般都于析构函数相反,.派生类对象初始化先调用基类构造再调派生类构造, 派生类对象析构清理先调用派生类析构再调基类的析构。

0 人点赞