- class A
- {
- private:
- int n1;
- int n2;
-
- public:
- A():n2(0),n1(n2+2){}
-
- void Print(){
- cout << "n1:" << n1 << ", n2: " << n2 <<endl;
- }
- };
-
- int main()
- {
-
- A a;
- a.Print();
-
- return 1;
- }
- class A
- {
- private:
- int n1;
- int n2;
- public:
- A():n2(0),n1(n2+2){}
- void Print(){
- cout << "n1:" << n1 << ", n2: " << n2 <<endl;
- }
- };
- int main()
- {
- A a;
- a.Print();
- return 1;
- }
答案:n1:1874928131,n2:0
如果把A类中构造函数改成:
- A()
- {
- n2 = 0;
- n1 = n2 +2;
- }
答案:n1是2,n2是0。
与其他函数不同,构造函数除了有名字\参数列表\函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。
分析:
1、成员变量在使用初始化列表初始化时,与构造函数中初始化成员列表的顺序无关,只与定义成员变量的顺序有关。
2、如果不使用初始化列表初始化,在构造函数内初始化时,此时与成员变量在构造函数中的位置有关。
3、类成员在定义时,是不能初始化的;类中const成员常量必须在构造函数初始化列表中初始化;类中static成员变量,必须在类外初始化。
4、静态变量进行初始化顺序是基类的静态变量先初始化,然后是它的派生类的静态变量,直到所有的静态变量都被初始化。这里需要注意全局变量和静态变量的初始化是不分次序的。这也不难理解,其实静态变量和全局变量都被放在公共内存区。可以把静态变量理解为带有“作用域”的全局变量。在一切初始化工作结束后,main函数会被调用,如果某个类的构造函数被执行,那么首先基类的成员变量会被初始化。
总结:
成员变量的初始化顺序就应该是:
- 1 基类的静态变量或全局变量
- 2 派生类的静态变量或全局变量
- 3 基类的成员变量
- 4 派生类的成员变量