轉換函式 (C++)
由建構函式,前面章節所述的轉換中的一種類型的物件可以隱含轉換為特定的類別型別。 本章節將說明一種方法可以提供的指定的類別型別明確地轉換成另一個型別。 類別型別轉換通常是使用型別轉換函數來完成。 轉換函式會使用下列語法:
文法
轉換函式名稱:
運算子轉換型別名稱**()**轉換型別名稱:
型別規範清單的指定給 ptr 運算子opt
下列範例指定將型別轉換的轉換函式Money可以在此輸入double:
// spec1_conversion_functions1.cpp
struct Money {
operator double() { return _amount; }
private:
double _amount;
};
int main() {
Money Account;
double CashOnHand = Account;
}
初始化CashOnHand與Account會從型別Account可以在此輸入double。
轉換函式通常稱為 「 轉型運算子",因為他們 (以及建構函式) 都使用轉型時,呼叫的函式。 下列範例會使用轉換,或是明確轉換時,若要列印目前的物件型別的值Money:
cout << (double)Account << endl;
在衍生類別中繼承的型別轉換函數。 轉換運算子會隱藏只有基底類別轉換成完全相同的型別轉換的運算子。 因此,使用者定義運算子 int 函式不會隱藏使用者定義 運算子短基底類別中的函式。
執行隱含轉換時,會套用只有一個使用者定義的轉換函式。 如果沒有明確定義的轉換函式,編譯器不會不會尋找物件可以轉換到其中的中繼型別。
如果所需的轉換,會造成模稜兩可,,則會產生錯誤。 有一個以上的使用者定義轉換或使用者定義的轉換和內建的轉換存在時,則會發生語意模糊。
範例
下列範例會說明具有潛在的模稜兩可的類別宣告:
// spec1_conversion_functions2.cpp
#include <string.h>
#include <stdio.h>
struct String {
// Define constructor that converts from type char *.
String( char *szBuffer ) {
strcpy_s( _text, szBuffer );
}
// Define conversion to type char *.
operator char *() {
return _text;
}
int operator==( const String &s ) {
return !strcmp( _text, s._text );
}
private:
char _text[80];
};
int main() {
String s( "abcd\0" );
char *ch = "efgh";
// Cause the compiler to select a conversion.
return s == ch; // C2666
}
在運算式中s == ch,編譯器有兩種選擇,並沒有辦法決定何者為正確。 它可以轉換ch物件的型別String建構函式,然後執行 [使用使用者定義的比較operator==。 它可以轉換或者s型別的指標至char *使用轉換函式,然後再執行 [指標的比較。
因為兩種選擇都 「 多更正 」 比其他] 下,編譯器無法判斷比較運算式的意義,就會產生錯誤。