c 筆記 型別轉換

2021-09-11 20:25:46 字數 1755 閱讀 6336

類型別轉換運算子是類的一種特殊成員函式,它負責將乙個類型別的指轉換成其他型別。型別轉換函式的一般形式

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...