C++ 類的注意事項

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);

    在這種情況下,我們只能顯示地進行初始化,而不能進行隱式地轉換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章