標籤:style blog color 使用 strong div 代碼 line
如果建構函式只接受一個實參,則它實際上定義了轉換為此類類型的隱式轉換機制,有時我們把這種建構函式稱作轉換建構函式。
能通過一個實參調用的建構函式定義了一條從建構函式的參數類型向類類型隱式轉換的規則。
例如,在Sales_data類中,接受string的建構函式和接受istream的建構函式分別定義了從這兩種類型向Sales_data隱式轉換的規則。也就是說,在需要使用Sales_data的地方,我們可以使用string或者istream作為替代:
建構函式:
Sales_data(const string &s);Sales_data(istream &);
Sales_data &combine(const Sales_data&);
string null_book="9-999-99999-9";
//構造一個臨時的Sales_data對象
//該對象的units_sold和revenue等於0,bookNo等於null_book
item.combine(null_book);
在這裡我們用一個string實參調用了Sales_data的combine成員。該調用時合法的,編譯器用給定的string自動建立一個Sales_data對象。新產生的這個(臨時)Sales_data對象被傳遞給combine。因為combine的參數是一個常量引用,所以我們可以給該參數傳遞以臨時量。
只允許一步類類型轉換
編譯器只會自動地執行一步類型轉換。例如,因為下面的代碼隱式地使用了兩種轉換規則,所以它是錯誤的:
//錯誤:需要使用者定義的兩種轉換:
//(1)把“9-999-99999-9”轉換成string
//(2)再把這個(臨時的)string轉換成Sales_data
item.combine("9-999-99999-9");
如果我們想完成上述調用,可以顯式地把字串轉換成string或者Sales_data對象:
//正確:顯式地轉換成string,隱式地轉換成Sales_data
item.combine(string("9-999-99999-9"));
//正確:隱式地轉換成string,顯式地轉換成Sales_data
item.combine(Sales_data("9-999-99999-9"));
類類型轉換不是總有效