本文主要是介绍深度探索C++ 对象模型(5)-Initialization list(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
四点:
1.list中的项目次序是由class中的members声明次序决定,不是由initialization list中的的代码决定
如下代码有一个陷阱,i值为一个不可预知未初始化的值。原因是按照定义 的顺序,i先被初始化,这个时候j还没有被初始化。
class X {public:int i;int j;public: X(int val) : j(val), i(j) {}};
执行测试代码,输出结果为:val is 1 100
X obj0(100);
cout << "val is " << obj0.i << " " << obj0.j << endl;;
2. initialization list的代码先于构造函数代码执行
3.可以调用member function 以设定一个member的初值 (this已经生成)
class X {int i;int xfoo( int val) {return val;}
public:X(int val) : i ( xfoo(val) ) //这里是正确的{}
};
构造函数等价于
X::X() {i = this->xfoo( val ); }
执行测试代码,输出结果为:val is 100 ,没问题!
X obj2(100);
cout << "val is " << obj2.i << endl;
4.调用基类的构造和初始化成员的顺序,也会有问题
class X{public:X(int x) :val(x) {} // A 的构造函数int val;int getVal() {return val;}};class FooBar : public X {int _fVal;public:int fval() {return _fVal;}FooBar(int val) : _fVal(val), X(fval()) { }};
调用顺序为
X::X(this, this->fval());//此时_fVal还未初始化
_fVal = val;
执行测试代码,输出结果为:val is 100 1
FooBar obj(100);
cout << "val is "<< obj.fval() << " "<< obj.getVal()<< endl;
【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2]: 代码地址 https://github.com/thefistlei/cplusStudy.git
这篇关于深度探索C++ 对象模型(5)-Initialization list(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!