对于以下程序:
#include <iostream>
using namespace std;
class Base
{
private:
int a;
int b;
public:
Base(int i):b(i),a(b){}
Base():b(0),a(b){}
int get_a(){return a;}
int get_b(){return b;}
};
int main()
{
Base base(90);
cout<<base.get_a()<<endl<<base.get_b()<<endl;
return 0;
}
本想得到的结果是a,b都为90。但是实际结果却是:
4273046
90
Process returned 0 (0x0) execution time : 0.101 s
Press any key to continue.
也即此时输出的第一个数是一个随机数,第二个是90。
初始化列表的成员变量的初始化是根据成员变量的声明顺序初始化的!!!!。
变量a在变量b之前声明,那么在类Base的构造函数初始化成员列表中,变量a会先定义,变量b会后定义,也就是说变量a会先初始化,而变量b会后初始化,所以,在执行Base(int i): b(i),a(b)时,a的值用b来初始化,其结果将是一个随机值,而b的值是i=90.!!!!!!!!!!!!!!
改一下声明的顺序,或者初始化的顺序都可以得到90 90。
例如:
#include <iostream>
using namespace std;
class Base
{
private:
//int a;
int b;
int a;//修改声明顺序
public:
Base(int i):b(i),a(b){}
Base():b(0),a(b){}
int get_a(){return a;}
int get_b(){return b;}
};
int main()
{
Base base(90);
cout<<base.get_a()<<endl<<base.get_b()<<endl;
return 0;
}
结果:
90
90
Process returned 0 (0x0) execution time : 1.057 s
Press any key to continue.
原因在于:在初始化列表中,成员变量的初始化顺序是其在类中声明顺序,而非列表中的顺序。!!!!!!
要注意按照与成员变量声明一致的次序来编写构造函数初始化列表,此外,尽可能避免使用成员来初始化其他成员,一般情况下,通过(重复)使用构造函数的形参而不是使用对象的数据成员,可以避免由初始化的执行次序而引起的任何问题。