類型別轉換運算子是類的一種特殊成員函式,它負責將乙個類型別的指轉換成其他型別。型別轉換函式的一般形式
operator type() const;
type表示某種型別。型別轉換運算子可以面向任意型別(除void之外)進行定義,只要該型別能作為函式的返回型別。
因此,我們不允許轉換成陣列或者函式型別,但允許轉換成指標或者引用型別。
#note#
乙個型別轉換函式必須市類的成員函式;它不能宣告返回型別,形參列表也必須為空。型別轉換函式通常應該是const
我們定義乙個簡單的類,表示0到255之間的乙個整數
class smallint
operator int() const
private:
std::size_t val;
};建構函式將算術型別的值轉換成smallint物件,而型別轉換運算子將smallint物件轉換成int:
smallint si;
si = 4; //首先將4隱式轉換為smallint,然後呼叫smallint::operator=
si + 3; //首先將si隱式轉換為int,然後指向整數的加法
為了防止隱式轉換,可以使用explicit關鍵字,要求顯示轉換
class smallint
//其他一致
};則我們在使用時:
smallint si = 3; //正確,因為建構函式沒有宣告為explicit,還是可以隱式轉換
si + 3; //錯誤,類的運算子是顯示的
static_cast(si) + 3; //正確,顯示地請求型別轉換
#tip#
其他型別向bool的型別轉化通常發生在條件部分,因此operator bool一般定義為explicit的。
如果乙個類中包含乙個或多個型別轉換,則必須確保在類型別和目標型別之間只存在唯一一種轉換方式。
例如,我們定義了兩種將b轉換為a的方法:
一種使用b的型別轉換運算子,另一種使用a的以b為引數的建構函式
struct b;
struct a
;struct b
;a f(const a&);
b b;
a a = f(b); //此處就會產生二義性錯誤:f(b::operator(a)) || f(a::a(const b&)) 兩種方式
//於是必須顯示構建
a a1 = f(b.operator a());
a a2 = f(a(b));
同時還需要避免在設計建構函式與過載函式時可能出現的二義性
struct c
;struct d
;void man(const c&);
void man(const d&);
man(10); //產生二義性錯誤,設計建構函式和過載函式時應該避免
如果我們對同乙個類既提供了轉換目標為算符型別的型別轉換,也提供了過載的運算子,則會遇到內建運算子和過載運算子的二義性
class smallint
private:
std::size_t val;
};smallint s1, s2;
smallint s2 = s1 + s2; //使用過載的operator+
int i = s3 + 0; //二義性錯誤:s3轉int,還是0轉smallint
C 筆記整理(型別轉換)
string mygoddess mygoddess char mywife mygoddess 兄弟,編譯器報錯計算機裡無論什麼型別,最根本都是一些0和1組成的。變數的含義是通過翻譯這些0和1來告訴你們。byte s 10 int i s 型別 可以安全的轉換為 byte short,ushort...
C 學習筆記 型別轉換
規則 任何型別a,只要其取值範圍包含在b中,就可以隱式轉化為型別b。強制轉換 取值範圍大的型別a強制轉換為取值範圍小的型別b 關鍵字 checked unchecked 對這種情況進行溢位檢查,上述問題會反饋錯誤資訊。也可在應用程式中配置,避免這種情況。convert.to.將字串值轉換為數值。為成...
mysql型別轉換c 型別轉換 C 型別轉換
一 簡介 型別轉換 把資料從一種型別轉換另一種型別 我們要求等號兩邊參與運算子必須型別一致,如果不一致,滿足下列條件會發生自動型別轉換或者隱式型別轉換。1.兩種型別相容 例如 int和double 相容 都是數字型別 2.目標型別大於源型別 double int 顯示型別轉換 1.兩種型別相相容 i...