構造函數隱式轉換

轉載博客:函數

http://blog.csdn.net/thefutureisour/article/details/7705771spa

構造函數會引發一個不引人注意的問題:
用單個實參來調用的構造函數定義了從從形參類型到類類型的一個隱式轉換。
舉個例子說:.net

[cpp]  view plain  copy
 
  1. class Sales_item  
  2. {  
  3. public:  
  4.     std::istream& input(std::istream& in);  
  5.     std::ostream& output(std::ostream& out);  
  6.     inline double avg_price() const;  
  7.     bool same_isbn(const Sales_item &rbs) const  
  8.     {  
  9.         return isbn == rbs.isbn;  
  10.     }  
  11.     Sales_item add(Sales_item& other);  
  12.     Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}  
  13. private:  
  14.     std::string isbn;  
  15.     unsigned units_sold;  
  16.     double revenue;  
  17. };  


這個類的same_isbn函數的輸入參數是這個類的類型,可是咱們卻能夠這樣調用這個函數:設計

[cpp]  view plain  copy
 
  1. Sales_item trans1;  
  2. string null_book = "9-999-99999-9";  
  3. trans1.same_isbn(null_book);  


這是由於Sales_item的構造函數能夠是帶單個實參的(也能夠不帶實參,由於我定義了默認實參7115145547),這時在調用trans1.same_isbn(null_book);時,就會發生類型轉化:從string轉換爲Sales_item。創建一個臨時的類的對象(一旦函數調用結束,就不能再放這個對象了)。code

爲了不這個狀況的發生,能夠將類的構造函數聲明爲explicit:對象

[cpp]  view plain  copy
 
  1. explicit Sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}  

這樣,前面的默認類型轉化就不起做用了。因此對於單形參構造函數,除非有很是明顯的理由讓他發生隱式類型轉換,否者咱們應該把它設計爲explicit,防止隱式轉化的發生。blog

固然咱們總能夠爲轉化而顯示的使用構造函數:ip

[cpp]  view plain  copy
 
    1. trans1.same_isbn(Sales_item(null_book));  
相關文章
相關標籤/搜索