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

看代码:   


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;
}

子类的构造函数和析构函数调用顺序_第1张图片

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

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

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

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

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

你可能感兴趣的:(c++,开发语言)