所有单参数的构造函数都必须是explicit的,以避免后台的类型转换。
否则一些宽松的规则将允许在没有显式类型转换操作的情况下进行类型转换。通常,这种不希望发生的情况会破坏代码的可读性,并导致难以发现的错误。
考虑下面的例子:
I n tCell obj; //obj是一个IntCell对象
obj = 37; //不会编译通过:类型不匹配
上面的代码构造了一个IntCell对象,并且进行了赋值。但是赋值语句并不会工作,因为在赋值语句的右侧并不是另一个IntCell对象。
取而代之的应该是使用obj的write方法。
然而C++拥有宽松的规则。通常,单参数构造函数定义了一个隐式类型转换(implicit type conversion),该转换创建了一个临时对象,从而使赋值(或函数参数)变成兼容的。在本例中,编译器试图将
obj = 37;
转换为
IntCell temporary = 37;
obj = temporary;
注意,临时对象的构造也可以通过使用单参数构造函数来实现。
使用explicit意味着单参数构造函数不能用来创建临时隐式对象。这样一来,既然IntCell构造函数已经声明为explicit,那么编译器就能够正确地分析出这里有一个类型不匹配。