规定必须用初始化列表...而我的思考结果是:
举个例,
class A
{
int &ref_;
const int i;
int a,b;
public:
A(int a_,int b_) { a=ref_; i=b; b=b_; }
};
假如能够执行,那么这个能保证怎样的语义?我们来看下扩展构造函数:
A::A(int a_,int b_)
{
this->a=this->ref_; //很明显,ref_并没有绑定.
this->i=this->b; //此时b却没赋值.
this->b=this->b_;
}
对于第一句可以看出是未定义行为..而第二句却是没意义的.由此可见,如果支持这样的做法,那么引用和常量都不能保证良好的行为.
但是如果必须规定初始化列表,我们来看看(改变下构造函数):
A::A(int a_,int b_):ref_(a_),i(a),b(b_){ a=ref_; }
扩展函数:
A::A(int a_,int b_)
{
ref_=a_; // 进行绑定.
i=a; //进行初始化
b=b_;
//初始化列表执行完,才是括号内的语句
a=ref_; //此时ref_已经绑定过.
}
这样可以保证比第一个更好的行为.....就这么多
举个例,
class A
{
int &ref_;
const int i;
int a,b;
public:
A(int a_,int b_) { a=ref_; i=b; b=b_; }
};
假如能够执行,那么这个能保证怎样的语义?我们来看下扩展构造函数:
A::A(int a_,int b_)
{
this->a=this->ref_; //很明显,ref_并没有绑定.
this->i=this->b; //此时b却没赋值.
this->b=this->b_;
}
对于第一句可以看出是未定义行为..而第二句却是没意义的.由此可见,如果支持这样的做法,那么引用和常量都不能保证良好的行为.
但是如果必须规定初始化列表,我们来看看(改变下构造函数):
A::A(int a_,int b_):ref_(a_),i(a),b(b_){ a=ref_; }
扩展函数:
A::A(int a_,int b_)
{
ref_=a_; // 进行绑定.
i=a; //进行初始化
b=b_;
//初始化列表执行完,才是括号内的语句
a=ref_; //此时ref_已经绑定过.
}
这样可以保证比第一个更好的行为.....就这么多
樱花大战, 有爱.