C++之派生类的构造函数和析构函数

派生类的构造函数

派生类对象的数据结构由基类中说明的数据成员和派生类中说明的数据成员共同组成。在创建派生类的对象时,不仅要对派生类中说明的数据成员初始化,而且还要对基类中说明的数据成员初始化。由于构造函数不能被继承,因此,派生类的构造函数必须通过调用基类的构造函数来初始化基类中的数据成员。所以,在定义派生类的构造函数中,不仅要对自己数据成员进行初始化,还要包含调用基类的构造函数对基类中数据成员进行初始化。如果,派生类中海油子对象,还应包含调用对子对象初始化的构造函数。

派生类的构造函数的定义格式:

<派生类构造函数名> ( <总参数表> ): <基类构造函数名> ( <参数表1> )

<子对象名> ( <参数表2> )….

{

<派生类数据成员初始化>

}

其中,派生类构造函数名同派生类名。派生类构造函数的总参数表中的参数包括冒号后面的所有参数表中的参数的总和。在对基类中数据成员初始化时,调用基类的构造函数产生一个对象,将该对象存放到创建派生类对象时所占有的内存单元中,作为派生类对象成员一部分。在对子对象初始化时,调用子对象类的构造函数进行初始化。最后调用派生类构造函数的函数体内语句对派生类本身的数据成员初始化。也可以把对派生类数据成员的初始化操作放在成员初始化列表中,这是派生类构造函数可能成为空函数。

派生类构造函数的调用顺序为:

1,基类构造函数

2,子对象类构造函数(如果有子对象的话)

3,派生类构造函数

派生类的析构函数

由于析构函数也不能被继承,因此执行派生类的析构函数时,也要调用基类的析构函数。执行派生类的析构函数的顺序正好与执行派生类构造函数的顺序相反:

1,先调用派生类的析构函数

2,再调用派生类中子对象类的析构函数

3,最后调用基类的析构函数

用一个例子来说明调用顺序:

<span style="font-size:18px;">#include <iostream>using namespace std;class A {public:A()//定义的基类A的默认构造函数{ a=0;cout<<"Default Constructor called.A\n"; }A(int i)//定义的带一个参数的基类A的构造函数{a=i;cout<<"Constructor called.A\n"; }~A()//定义的基类A的析构函数{ cout<<"Destructor called.A\n"; }void Print(){ cout<<a<<","; }int Geta(){ return a; }private:int a;};class B:public A//派生类B公有继承基类A{public:B()//派生类B的默认构造函数{ b=0;cout<<"Default Constructor called.B\n"; }B(int i,int j,int k);//说明的派生类B的构造函数~B()//派生类B的析构函数{ cout<<"Destructor called.B\n"; }void Print(){A::Print();//说明基类A的成员函数cout<<b<<","<<aa.Geta()<<endl;//通过子对象调用基类A的成员函数}private:int b;A aa;//子对象};B::B(int i,int j,int k):A(i),aa(j),b(k)//派生类B的构造函数的函数体{cout<<"Constructor called.B\n";}int main(){B bb[2];//定义的派生类B的对象数组bb[0]=B(3,4,5);//通过派生类B对每个数组元素进行赋值bb[1]=B(7,-8,9);for(int i=0;i<2;i++)bb[i].Print();//通过对象调用成员函数return 0;}</span>

程序分析:

1,前六行输出的是在创建派生类B的对象数组中的两个对象元素时调用派生类B的默认构造函数前先调用基类A的默认构造函数,创建一个数组元素调用两次基类A的默认构造函数,再调用一次派生类B的构造函数。因此输出结果中的前六行。

2,接着输出的第七行到十八行是在调用派生类B的构造函数时创建临时对象时,再将临时对象赋值给数组对象元素,然后再调用析构函数将临时对象释放。因此,每赋值给一个数组对象元素时,都会创建一个临时对象,在创建临时对象的过程中,先调用两次基类A的构造函数,再调用一次派生类B的构造函数,然后释放临时对象时,先调用一次派生类B的析构函数,再调用两次基类A的析构函数。因此赋值给两个数组对象元素会输出七到十八行的结果。

3,接着输出的两行数字是派生类B的对象数组的元素的数据值。

醒来第一眼看见的是他,然后倒头继续睡。这就是我想要的幸福。

C++之派生类的构造函数和析构函数

相关文章:

你感兴趣的文章:

标签云: