本文共 1718 字,大约阅读时间需要 5 分钟。
与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。 [百度百科 ]
f0211.cpp 引用的初始化:
#includeusing namespace std;class A{ int i; int &ri; int &rii;public: A(int ii): i(ii), ri(i), rii(ii) { cout << "in constructor\n" << "i = " << i << " ri = " << ri << " rii = " << rii << endl; } void print() { cout << "i = " << i << " ri = " << ri << " rii = " << rii << endl; }};void main(){ A a(2); a.print();}程序的输出结果:in constructori = 2 ri = 2 rii = 2i = 2 ri = 2 rii = 4199850t
解释:rii通过初始化列表初始化为ii,由于ii是构造函数的形参,随着构造函数的运行结束而消失,因此后面的rii将是不确定的结果。
自己有些不理解,为什么i在后面是确定的结果呢?所以就把它们的地址也进行了输出。#includeusing namespace std;class A{ int i; int &ri; int &rii;public: A(int ii): i(ii), ri(i), rii(ii) { cout << "in constructor\n" << "i = " << i << " ri = " << ri << " rii = " << rii << endl; cout << "&ii = " << &ii << endl; cout << "&i = " << &i << " &ri = " << &ri << " &rii = " << &rii << endl; } void print() { cout << "i = " << i << " ri = " << ri << " rii = " << rii << endl; }};void main(){ A a(2); a.print();}运行结果:in constructori = 2 ri = 2 rii = 2&ii = 0019FEE4&i = 0019FF34 &ri = 0019FF34 &rii = 0019FEE4i = 2 ri = 2 rii = 4199882
可以看到,ii和rii的地址、i和ri的地址竟是相同的。这就让我很惊讶,打算百度看看有没有这方面的点。
结果,这方面的没找着,却收获了另一个点。##意外之喜
#includeusing namespace std;class foo1{ int i; int j;public: foo1(int x): i(x), j(i) { cout << "i = " << i << " j = " << j << endl; }};class foo2{ int i; int j;public: foo2(int x): j(x), i(j) { cout << "i = " << i << " j = " << j << endl; }};int main(){ foo1 a(1); foo2 b(2); return 0;}运行结果:i = 1 j = 1i = -858993460 j = 2
喏,i的值很不可思议。
解释:成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。
所以,一个好的习惯是,按照成员定义的顺序进行初始化。
转载地址:http://nptai.baihongyu.com/