c++ 类类型的隐式转换
单实参构造函数定义了从形参类型到该类类型的一个隐式转换。
class Sales_item { public: // default argument for book is the empty string Sales_item(const std::string &book = “”): isbn(book), units_sold(0), revenue(0.0) { } Sales_item(std::istream &is); };
这里的两个构造函数都定义了一个隐式转换。因此在需要使用一个Sales_item类型对象的地方,也可以使用一个string或istream:
strring null_book = “9-999-99999-9”; // ok: builds a Sales_item with 0 units_sold, 0.0 revenue, and isbn equal to null_book item.same_isbn(null_book); // ok: uses the Sales_item istream constructor to build an object to pass to same_isbn item.same_isbn(cin);
以最后一行代码为例,将cin隐式转换为Sales_item。该转换执行接受一个istream的Sales_item构造函数,该构造函数通过标准输入创建一个(临时的)Sales_item对象,传递给same_isbn。
c++的这种隐式转换有时并不是我们想要的。可以通过将构造函数声明为explicit,来防止这种隐式转换。当构造函数被声明为explicit时,编译器将不使用它作为转换操作符。
class Sales_item { public: // default argument for book is the empty string explicit Sales_item(const std::string &book = “”): isbn(book), units_sold(0), revenue(0.0) { } explicit Sales_item(std::istream &is); }; … item.same_isbn(null_book); // error: string constructor is explicit item.same_isbn(cin); // error: istream constructor is explicit
explicit关键字只能用于类内部的构造函数声明上。不要在类的定义体外部所做的定义上再重复它。
通常,除非有明显的理由想要定义隐式转换。否则,单形参构造函数应该为explicit。当转换确实有用时,可以显示的构造对象。
strring null_book = “9-999-99999-9”; item.same_isbn(Sales_item(null_book));
【学习资料】 《c++ primer》