建構函式會引起乙個不引人注意的問題:
用單個實參來呼叫的建構函式定義了從從形參型別到類型別的乙個隱式轉換。
舉個例子說:
[cpp]view plain
copy
class sales_item
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函式的輸入引數是這個類的型別,但是我們卻可以這樣呼叫這個函式:
[cpp]view plain
copy
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:
[cpp]view plain
copy
explicit sales_item(const std::string &book = "7115145547"):isbn(book),units_sold(0),revenue(0.0){}
這樣,前面的預設型別轉化就不起作用了。所以對於單形參建構函式,除非有非常明顯的理由讓他發生隱式型別轉換,否者我們應該把它設計為explicit,防止隱式轉化的發生。
當然我們總可以為轉化而顯示的使用建構函式:
[cpp]view plain
copy
trans1.same_isbn(sales_item(null_book));
建構函式 建構函式隱式轉換 拷貝建構函式
建構函式對於我們來說是比較熟悉的,c primer裡提到 類通過乙個或幾個特殊的成員函式來控制其物件的初始化過程,為 建構函式。例1 class fruit 定義乙個類,名字叫fruit 這樣的建構函式是我們比較常見的,但是如果變成 class fruit 定義乙個類,名字叫fruit 即使是乙個類...
C 轉換建構函式和隱式轉換函式
其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成另一指定的型別,也即是強制轉換,比如 int a int 1.23 其作用是將1.23轉換為整形1。然而對於使用者自定義的類型別,編譯 系統並不知道如何進行轉換,所以需要定義專門的函式來告訴編譯系...
C 轉換建構函式和隱式轉換函式
本文的所有內容均來自 今天是第一次聽到c 還有個轉換建構函式,之前經常見到預設建構函式 拷貝建構函式 析構函式,但是從沒聽說過轉換建構函式,隱式轉換函式也是一樣,c 的確是夠博大精深的,再次嘆服!其實我們已經在c c 中見到過多次標準型別資料間的轉換方式了,這種形式用於在程式中將一種指定的資料轉換成...