Day1
如果成员是const 、引用,或者属于某种未提供默认构造函数的类类型,我们必须通过构造函数初始化值列表为这些成员提供初始值。
例如:
class ConstRef{
public:
ConstRef(int ii);
private:
int i;
const int ci;
int &ri;
}
ConstRef::ConstRef(int ii){
i = ii;
ci = ii; ( 错误 不能赋值)
ri = ii; (ri没有被初始化)
}
ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(ii){}(正确)
这里也体现了数据成员的初始化和赋值之间的差异
编译器创建的构造函数又称为合成构造函数
初始化的顺序没有什么要求,但是如果一个成员使用另一个成员来初始化的话,就要考虑初始化的顺序了。
但是尝试primer习题中的这个例子 发现编译过程并没有报错,按照书上的说法是先构造a 会有问题。 环境Vs2010
struct X {
X(int i , int j):b(j),a(b%i){}
int a,b;
};
C11新增委托构造函数
构造函数,在实例化的过程中会调用,所以有些情况下,没有默认构造函数,编译还是可以过的。
只允许一步类类型转换
例如 a接受string类型的参数构造 那么b=a("tempconstructor") 错误 string c = "tmpconstructor" b=a(c) 正确
可以用explicit抑制构造函数定义的隐式转换(explicit只能出现在类内声明处) 只能直接初始化 不接受拷贝形式初始化
a{
explicit a(string b){}
}
那这时上述构造方式都会有问题