C++ primer 学习笔记(第七章)

这一章看的没之前那么仔细,只是囫囵吐枣的看了一遍。

  • 构造函数的初始值有时必不可少

有时候数据成员的赋值和初始化是可以忽略区别的。但是如果成员是const或者引用的话就必须要初始化了。这是因为,如果没有在构造函数的初始值列表中显式的初始化成员,他会在构造函数体执行之前执行默认初始化。当然初始值必不可少的情况也适用于:当成员属于某种类类型而且该类没有定义默认构造函数的话。

  • 成员初始化的顺序

构造函数初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序,成员初始化的具体执行顺序与他们在类内出现的顺序一致。

  • 隐式的类类型转换

先看一份丑丑的code:

声明了一个接受string的构造函数,我们相当于定义了从这种类型向PP隐式转换的规则。我们调用a的sum方法,编译器用给定的string自动生成了一个PP对象,新生成的这个对象传递给了sum。但是这种类型转换只允许一步转换。所以这样写编译器就会报错了。

因为这里使用了两种类型转化:“999”到string类型的转换,string类型到PP的类型转换。当然我们如果显式声明转换就可以啦。

当然我们也可以抑制构造函数定义的隐式转换。我们可以把构造函数声明为explicit就可以了。但是只能在类内声明构造函数使用explicit关键词。而且explicit构造函数只能用于直接初始化。

对于explicit构造函数虽然我们无法隐式转换,但是显式类型强转还是可以的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注