您的位置:首页 > 编程语言 > C语言/C++

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

2016-02-16 08:42 375 查看

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

派生类的构造函数和析构函数

#include <iostream>


using namespace std;


class student

{

public:

student(int num,char* n):number(num),name(n){}

~student(){cout << "student deconstruted" << endl;}

protected:

int number;

char* name;

};


class student1:public student

{

public:

student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}

void show();

~student1(){cout << "student1 deconstruted" << endl;}

protected:

bool sex;

int age;

};


void student1::show()

{

cout << "num: " << number << endl;

cout << "name: " << name << endl;

cout << "age: " << age << endl;

cout << "sex: " << sex << endl;

}


int main()

{

student1 stu(45,"shukai",true,20);

stu.show();

return 0;

}



1.1派生类构造函数的一般形式为:
派生类构造函数名(总参数表列):基类构造函数名(参数表列)
{派生类新增加的成员的初始化语句}
1.2对派生类新增加的成员可以用初始化表进行初始化。如:
student1(int num,char* n,bool s,int a):student(num,n),sex(s),age(a){}
1.3在类中对派生类构造函数做声明时,不包括基类构造函数名以及参数表列(student(num,n)),只在定义函数时将它列出。
1.4建立一个对象时,执行构造函数的顺序:
A.派生类构造函数调用基类的构造函数。
B.再执行派生类构造函数体本身(即派生类构造函数的函数体)

有子对象的派生类构造函数

#include <iostream>


using namespace std;


class student

{

public:

student(int n,char* nam):num(n),name(nam){}

void display(){cout << name << " " << num << endl;}

protected:

int num;

char* name;

};


class student1:public student

{

public:

student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),

monitor(n1,nam1),age(a),sex(s){}

void display1();

void display_monitor();

private:

int age;

bool sex;

student monitor;

};


void student1::display1()

{

cout << "student is " << endl;

display();

cout << age << " " << sex << endl;

}


void student1::display_monitor()

{

cout << "monitor is " << endl;

cout << age << " " << sex << endl;

}


int main()

{

student1 stu(45,"shukai",1,"abc",20,true);

stu.display1();

stu.display_monitor();

return 0;

}




1.1类的数据成员除了标准成员,如(int,char)或系统提供的类型(如string),实际上,类的数据成员中还可以包含类对象,如可以声明一个类时包含这样的数据成员:
Student s1;
这时,s1就是类对象中的内嵌对象,称为子对象(subobject)。
1.2派生类构造函数的任务应该包括3部分:
A.对基类成员的初始化
B.对子对象数据成员的初始化。
C.对派生类数据成员的初始化。
1.3定义派生类构造函数的一般形式为:

派生类构造函数名(总参数表列);基类构造函数名(参数表列),子对象名(参数表列)
{派生类中新增数据成员的初始化语句}
如:student1(int n,char* nam,int n1,char* nam1,int a,bool s):student(n,nam),monitor(n1,nam1),age(a),sex(s){}
只不过派生类中的新生成员用初始化列表来进行初始化而已。
1.4基类构造函数和子对象的次序是可以任意的,如上面的构造函数可以写成:
student1(int n,char* nam,int n1,char* nam1,int a,bool s):monitor(n1,nam1),student(n,nam),age(a),sex(s){}

编译系统是根据相同的参数名,而不是根据参数的次序来传递数据的。

多层派生时的构造函数

#include <iostream>

#include <string>


using namespace std;


class student

{

public:

student(int n,string nam){num=n;name=nam;}

void display(){cout << "num: " << num << " name: " << name << endl;}

protected:

int num;

string name;

};


class student1:public student

{

public:

student1(int n,string nam,int a):student(n,nam),age(a){}

void display1(){display();cout << "age: " << age << endl;}

protected:

int age;

};


class student2:public student1

{

public:

student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){}

void display2(){display1();cout << "sex: " << sex << endl;}

protected:

bool sex;

};


int main()

{

student2 stu(45,"shukai",20,true);

stu.display2();

return 0;

}



1.1 student2的构造函数为student2(int n,string nam,int a,bool s):student1(n,nam,a),sex(s){},注意不必列出每一层的构造函数,只要列出上一层的构造函数即可。

派生类构造函数的特殊形式

1.1当不需要对派生类新增成员做任何初始化操作的时候,派生类构造函数的函数体可以为空,即构造函数是空函数。
1.2如果在基类中没有构造函数或者定义了没有参数的构造函数,那么在定义派生类的构造函数时可以不必写基类的构造函数。

派生类的析构函数

1.1析构函数与派生类的构造函数相反,构造函数是先构造基类在构造子对象再构造派生类,而析构时,先对派生类析构,再对子对象析构,然后再对基类析构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: