C++ 类构造、析构函数调用顺序

1、子类和父类 构造、析构函数顺序

class BaseClass
{
public:
	BaseClass();
	~BaseClass();
private:
};

BaseClass::BaseClass()
{
	cout << "基类构造函数" << endl;
}

BaseClass::~BaseClass()
{
	cout << "基类析构函数" << endl;
}


class SubClass: public BaseClass
{
public:
	SubClass(string name);
	SubClass();
	~SubClass();

private:
	string mName;
};

SubClass::SubClass()
{
	cout << "子类构造函数" << endl;
}
SubClass::SubClass(string name)
{
	mName = name;
	cout << "子类构造函数" << name << endl;
}
int main()
{
	SubClass SubClass;
}

输出:

基类构造函数
子类构造函数
子类析构函数
基类析构函数

结论,调用顺序 基类构造函数-》子类构造函数-》子类析构函数-》基类析构函数

2、类成员变量和类本身的构造、析构函数顺序

class ClassA
{
public:
	ClassA();
	~ClassA();

private:

};

ClassA::ClassA()
{
	cout << "ClassA构造函数" << endl;
}

ClassA::~ClassA()
{
	cout << "ClassA析构函数" << endl;
}


class ClassB
{
public:
	ClassB();
	~ClassB();

private:

};

ClassB::ClassB()
{
	cout << "ClassB构造函数" << endl;
}

ClassB::~ClassB()
{
	cout << "ClassB析构函数" << endl;
}

class CombineClass
{
public:
	CombineClass();
	~CombineClass();

private:
	ClassA classA;
	ClassB classB;
};

CombineClass::CombineClass()
{
	cout << "组合类构造函数" << endl;
}

CombineClass::~CombineClass()
{
	cout << "组合类析构函数" << endl;
}



int main()
{
	CombineClass combineClass;
}

输出:

ClassA构造函数
ClassB构造函数
组合类构造函数
组合类析构函数
ClassB析构函数
ClassA析构函数

结论:成员变量构造函数-》类自身构造函数-》类自身析构函数-》成员变量析构函数

成员变量之间构造函数顺序和成员变量在类中定义的顺序一样,析构时反序

 

3、成员变量有参数,且在主类的构造函数参数列表中做初始化(初始化时的顺序和定义时的顺序不一样)的情况

class ClassA
{
public:
	ClassA(string name);
	~ClassA();

private:
	string mName;
};

ClassA::ClassA(string name)
{
	mName = name;
	cout << "ClassA构造函数" << endl;
}

ClassA::~ClassA()
{
	cout << "ClassA析构函数" << endl;
}


class ClassB
{
public:
	ClassB(string name);
	~ClassB();

private:
	string mName;
};

ClassB::ClassB(string name)
{
	mName = name;
	cout << "ClassB构造函数" << endl;
}

ClassB::~ClassB()
{
	cout << "ClassB析构函数" << endl;
}

class CombineClass
{
public:
	CombineClass(string nameA, string nameB);
	~CombineClass();

private:
	ClassA classA;
	ClassB classB;
};

CombineClass::CombineClass(string nameA, string nameB):classB("nameB"), classA("nameA")
{
	cout << "组合类构造函数" << endl;
}

CombineClass::~CombineClass()
{
	cout << "组合类析构函数" << endl;
}

结果:

ClassA构造函数
ClassB构造函数
组合类构造函数
组合类析构函数
ClassB析构函数
ClassA析构函数

结论:调用顺序还是和声明是的顺序一样,跟初始化的顺序无关

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值