看代码:
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的构造函数了)