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

发布时间:2024年01月17日

看代码:? ?


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的构造函数了)?

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135660364
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。