2013-04-14 68 views
1

我已經寫了幾年C,只是爲了一些需要進入C++!我的書是C++ Primer 5/e,並且我已經涉及構造函數轉換的主題並且遇到了一些問題關於在C++中的類鑄造

在C++中,我們有很多類型的轉換。 像static_cast,dynamic_cast,我們也有類似功能的轉換,這是一種明確的轉換。

class Sales_data{ 
public: 
    //C++11 feature,ask compiler to create a default constructor for us 
    Sales_data() = default; 
    Sales_data(const std::string &s, unsigned n, double p): 
     bookNo(s), units_sold(n), revenue(p*n); 
    explicit Sales_data(const std::string &s): bookNo(s){} 
    explicit Sales_data(std::istream&); 

    Sales_data combine(const Sales_data &item); 
private: 
    std::string bookNo;  // implicitly initialized to the empty string 
    unsigned units_sold; 
    double revenue; 
}; 

std :: string s是ISBN。 和第四個從標準輸入讀取ISBN號碼

我知道沒有明確說明,以下聲明是合法的。

item.combine(string("ISBN NUMBER")); 
item.combine(cin); 

//error: need two conversion const char *->temporary string-> temporary Sales_item 
item.combine("ISBN NUMBER"); 

我只是沒有得到什麼是使最後兩個構造函數顯式的好處?

http://www.cplusplus.com/reference/vector/vector/vector/

我不能點,爲什麼有些矢量的構造函數的聲明明確?是什麼原因?

+2

Em因爲真的很奇怪,當有人說「do_something(5)」意味着要傳遞一個包含5個元素的向量嗎? – kennytm

+0

您的「合法」語句都不合法,因爲您無法將臨時變量綁定到非常量的Sales_data ''在'combine()'中的引用。 – chris

+0

@chris它們對我來說都是合法的......第一個將一個臨時對象傳遞給const-ref,第二個對象通過引用指出非臨時(cin)。 – maditya

回答

3

explicit禁止調用構造函數來執行自動轉換。構造函數仍然可以用作普通構造函數。是的,該語言應該被設計爲默認具有explicit構造函數,並註釋(implicit?)轉換構造函數......但這就是故事的結果。

std::vector<T>::vector(int)被標記爲顯式的,例如原因是禁止以下代碼:

void do_fancy_stuff(const std::vector<std::string> &data); 

do_fancy_stuff(20); 

如果向量構造是不明確的,將被用於將int轉換爲20空的vector字符串,這沒有什麼意義。

當編寫一個構造函數TypeA::TypeA(TypeB x)是懷疑的總體思路:「是這樣的構造轉換TypeBTypeA或只是使用x作爲一個參數。如果是後者,加explicit

+0

感謝@rodrigo,每當我們設計我們的課程時,是否有可能發現這樣的問題? –

+2

@TimHsu:那麼,尋找任何可以用一個參數調用的構造函數,並認爲:「這是一個轉換運算符」?如果「是」什麼都不做;如果「否」添加「顯式」。如果有疑問,只需添加它。 – rodrigo

+0

「如果有疑問,只需添加它。」這是一個很好的建議。 –