先有如下构造函数版本:
class Sales_item{
public:
Sales_item(const std::string &book): isbn(book),units_sold(0),revenue(0.0){}
Sales_item(std::istream &is);
}
原本的成员函数same_isbn()接收一个Sales_item对象作为实参,判断两个对象是否对应的是同一本书。
但是 String null_book="9-99-9999"
item.same_isbn(null_book);也是成立的,因为进行了隐式的类类型转换,使用string类型的null_book(通过默认构造函数)创建了一个临时的对象,然后用该临时对象作为参数传递给same_isbn()函数。
以上这种就成为类类型的隐式转换。可以通过explicit标识来防止进行隐式类类型转换。
class Sales_item{
public:
explicit Sales_item(const std::string &book): isbn(book),units_sold(0),revenue(0.0){}
explicit Sales_item(std::istream &is);//注意explicit只能出现在类型的申明中,在之后类外进行定义时, explicit关键字不能够再出现。
}
如此一来,item.same_isbn(null_book)将是错误的。