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