1,explicit關鍵字
在類的構造函數中,當構造函數只有一個輸入變量時,如果不加入explicit關鍵字,那麼它實際上定義了轉換爲此類類型的隱式轉換機制,例如下面的代碼:
class Sales_data {
friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
public:
Sales_data() = default;
Sales_data(const std::string &s, unsigned n, double p):
bookNo(s), units_sold(n), revenue(p*n) { }
Sales_data(const std::string &s): bookNo(s) { }
Sales_data(std::istream&);
std::string isbn() const {return bookNo; }
Sales_data &combine(const Sales_data&);
private:
double avg_price() const
{return units_sold ? revenue/units_sold : 0; }
std::string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
第三個構造函數只有接受一個string類型的輸入,這個時候在需要使用Sales_data類的地方,我們可以使用string作爲替代:string null_boolk= "999-999";
item.combine(null_book);
上面的語句,編譯工具是完全能正確編譯通過的,但是如果在構造函數前面加上explicit關鍵字,這種隱式的轉換就不能編譯通過了,就會出現像下面這樣的編譯錯誤:
main.cpp:9:15: error: no viable conversion from 'string' (aka
'basic_string<char>') to 'const Sales_data'
item.combine(null_book);
在這種情況下,我們只能顯示地進行初始化,而不能進行隱式地轉換。