子类的构造函数和析构函数调用顺序

文章详细解释了C++中类的构造和析构函数调用顺序,包括静态成员的特殊性、父类构造先于子类、以及静态成员仅在类外初始化时分配内存。
摘要由CSDN通过智能技术生成

看代码:   


class A {
public:
	A() { cout << __FUNCTION__ << endl; }
	~A() { cout << __FUNCTION__ << endl; }
};

class B {
public:
	B() { cout << __FUNCTION__ << endl; }
	~B() { cout << __FUNCTION__ << endl; }
};

class D {
public:
	D() { cout << __FUNCTION__ << endl; }
	~D() { cout << __FUNCTION__ << endl; }
};

// B是C的父类
class C : public B {
public:
	C() { cout << __FUNCTION__ << endl; }
	~C() { cout << __FUNCTION__ << endl; }

private:
	A a;  // 在C类中创建A类对象
	static D d;  // 在C类中创建D类的静态对象
};

D C::d;  // 在类外对静态成员初始化(不赋值默认为空),静态成员只有在类外初始化的时候才会分配内存

void test() {
	C c;
}

int main(void) {

	test();

	system("pause");

	return 0;
}

C类为B类的子类,同时在C类定义了D类的静态成员和A类的普通成员。 

看上面的结果,构造函数的调用顺序:    

1. 静态成员对象的构造函数(因为静态成员在程序运行之前就会分配内存,前提是在类外进行初始化)  ->  父类的构造函数  ->   普通成员对象的构造函数  ->   自己的构造函数。 

2. 析构函数的调用顺序和构造函数相反。 

3. 因为静态成员直到程序结束才会释放,所以上面没有D的析构函数,并且静态成员只会初始化一次,也就是整个程序静态成员的构造函数只会调用一次。(可以试着再创建一个C类对象,就不会调用D的构造函数了) 

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值