构造函数是用来初始化类的数据成员,它不被子类继承。在创建子类对象时,为了初始化从父类继承来的数据成员,系统需要调用其父类的构造方法。
当你创建一个派生类对象时,构造函数没有参数,从基类的构造函数开始调用,然后调用派生类的构造函数。
构造函数的调用是对直接基类而言的,间接基类的构造函数不会被调用。
子类有构造函数,基类的构造函数有参数,此时应当在子类的构造函数处,使用初始化列表的方法来调用父类的构造函数,否则会出错。
析构函数是用来释放内存空间的,在调用时,是从子类依次向父类进行调用。
下面我们来看一段具体的代码。
#pragma once
#include <iostream>
#include <cstdlib>
#include <string>
using std::cout;
using std::string;
using std::endl;
class Cfather
{
protected:
int num;
string name;
string sex;
public:
//父类构造函数
Cfather(int num, string name,string sex)
{
this->name = name;
this->num = num;
this->sex = sex;
cout << "父类构造函数" << endl;
}
void show();
~Cfather()
{
cout << "父类的析构函数" << endl;
cout << endl << endl << endl;
}
};
void Cfather::show()
{
cout << name << " " << sex << " " << num << endl;
}
class Cson : public Cfather
{
string clas;
string school;
public:
//子类构造函数
Cson(int num,string name,string sex,string clas,string school):Cfather(num,name,sex) //使用初始化列表调用父类构造函数
{
this->school = school;
this->clas = clas;
cout << "子类构造函数" << endl;
}
~Cson()
{
cout << "子类析构函数" << endl;
}
};
class CGrandson : public Cson
{
public:
CGrandson(int num, string name, string sex, string clas, string school);
~CGrandson();
private:
};
CGrandson::CGrandson(int num, string name, string sex, string clas, string school): Cson(num,name,sex,clas,school)
{
cout << "孙子类的构造函数" << endl;
}
CGrandson::~CGrandson()
{
cout << "孙子类的析构函数" << endl;
}
#include "标头.h"
int main()
{
/*Cfather father(123, "XXX", "man");*/
Cson son(38,"XXX","men","五(2)班","XXX");
/*father.show();*/
son.show();
cout << endl << endl << endl;
CGrandson grandson(10, "xxx", "women", "五(2)班", "XXXX");
return 0;
}
运行结果如下:
可以看的构造函数的调用是从最顶层的父类开始的,依次向下调用。而析构函数的调用刚好相反,是从最底层的派生类开始,依次向上调用。