笔记
//Student.h
[explicit修饰] Student (int n);
Student doh("Homer" , 10); doh = 5; //没有 explicit
=>
doh = Student(5);
doh = 5; 报错! //有 explicit
from C++ Primer Plus
explicit Student (const std::string & s) : name(s) , scores() {} explicit Student (int n) : name("Nully") , scores(n) {}
本书前面说过,可以用一个参数调用的构造函数将用作从参数类型到类类型的隐式转换函数;
但这通常不是好主意。在上述第二个构造函数中,第一个参数表示数组的元素个数,而不是数
组中的值,因此将一个构造函数用作int到Student的转换函数是没有意义的,所以使用explicit
关闭隐式转换。如果省略该关键字,则可以编写如下所示的代码。
Student doh("Homer" , 10); //创建Homer名字的学生,并构造尺寸为10的分数数组 doh = 5; //重置学生名称为Nully,重置尺寸为5的分数数组
在这里,马虎的程序员检入了doh而不是doh[0] 。如果构造函数省略了explicit,则将使用
构造函数调用Student(5)将5转换为一个临时Student对象,并使用Nully来设置成员name
的值。因此赋值操作将使用临时对象替换原来的doh值。使用explicit后,编译器将认为上述
赋值运算符是错误的。
C++和约束
C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转
换,使用const限制方法修改数据,等等。这样做的根本原因是:在编译阶段出现错误优于
在运行阶段出现错误。