一、构造函数的执行规则
C++构造函数的调用顺序为:
- 如果类中包含静态成员变量,先执行静态成员变量的构造函数。
- 如果类是派生类,则先执行基类的构造函数。同样如果基类也是一个派生类,它也要先执行基类的构造函数。
- 执行成员变量中的构造函数,根据定义的顺序来,先执行类内初始化,再执行列表初始化。
- 执行本类的构造函数。
1.1 测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// test.h #pragma once #include<iostream> using namespace std; class CTA { public: CTA() { cout << "CTA()" << endl; }; CTA(int n) { cout << n << endl; } ~CTA() {}; }; class CTB: public CTA { // 继承CTA public: CTB() { cout << "CTB()" << endl; }; ~CTB() {}; CTA m_a = CTA(1); }; |
在主函数中执行CTB b
,程序将会输出:
1 2 3 |
CTA() 1 CTB() |
二、静态成员变量
当类中含有静态成员的时候,首先会执行静态成员变量的构造函数。
准确来说不能说是先执行静态成员的构造函数,而是在程序一开始就会执行静态成员的构造函数,因为静态变量都是一开始就分配好内存了,这个操作在b创建之前。
修改test.h
的代码为:
1 2 3 4 5 6 7 8 9 |
class CTB: public CTA { public: CTB() { cout << "CTB()" << endl; }; ~CTB() {}; CTA m_a = CTA(1); static CTA mStatic; // 加入静态成员变量 }; CTA CTB::mStatic(99); // 定义静态成员变量 |
main
函数中的内容:
1 2 3 4 5 |
int main(){ cout << "create obj b" << endl; CTB b; return 0; } |
程序输出:
1 2 3 4 5 |
99 create obj b CTA() 1 CTB() |
可见静态成员的99
在create obj b
之间就已经执行了。
评论