轉載博客:
http://blog.csdn.net/thefutureisour/article/details/7705771
構造函數會引起一個不引人注意的問題:
用單個實參來調用的構造函數定義了從從形參類型到類類型的一個隱式轉換。
舉個例子說:
- class Sales_item
- {
- public:
- std::istream& input(std::istream& in);
- std::ostream& output(std::ostream& out);
- inline double avg_price() const;
- bool same_isbn(const Sales_item &rbs) const
- {
- return isbn == rbs.isbn;
- }
- Sales_item add(Sales_item& other);
- Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}
- private:
- std::string isbn;
- unsigned units_sold;
- double revenue;
- };
這個類的same_isbn函數的輸入參數是這個類的類型,但是我們卻可以這樣調用這個函數:
- Sales_item trans1;
- string null_book = "9-999-99999-9";
- trans1.same_isbn(null_book);
這是因為Sales_item的構造函數可以是帶單個實參的(也可以不帶實參,因為我定義了默認實參7115145547),這時在調用trans1.same_isbn(null_book);時,就會發生類型轉化:從string轉換為Sales_item。建立一個臨時的類的對象(一旦函數調用結束,就不能再放這個對象了)。
為了避免這個情況的發生,可以將類的構造函數聲明為explicit:
這樣,前面的默認類型轉化就不起作用了。所以對於單形參構造函數,除非有非常明顯的理由讓他發生隱式類型轉換,否者我們應該把它設計為explicit,防止隱式轉化的發生。
當然我們總可以為轉化而顯示的使用構造函數:
- trans1.same_isbn(Sales_item(null_book));