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》

posted on 2013-02-19 18:01  zhuyf87  阅读(644)  评论(0编辑  收藏  举报

导航