c 過載型別轉換運算子

2021-09-26 12:00:02 字數 1947 閱讀 8155

型別轉換運算子

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

乙個型別轉換函式必須是類的成員函式,不能有返回型別,形參列表也必須為空,通常是const的。

operator type() const;

class

smallint

//轉換源,為int型。可將算術型別轉換成smallint型別

//沒有限制型別轉換,可以是轉換成非常量

operator

int()

const

//將smallint型別轉換成int

operator

int*()

const

//顯式的型別轉換運算子,只能是常量

explicit

operator

int()

const

smallint

operator

=(smallint si)

private:

intval;

int*p; };

smallint si,si2;

si = 4;

//呼叫的型別轉換將4轉換成smallint,再呼叫過載賦值運算子

si = si2;

//直接呼叫的過載賦值運算子

cout << si + 3 << endl;

//先將si隱式的轉換成int,再呼叫整數的加法

cout <<

static_cast

<

int>(si) + 3 << endl;

如果類中包含乙個或多個型別轉換,則必須確保在類型別和目標型別之間只存在唯一一種轉換方式,避免二義性

實參匹配和相同的型別轉換

structb;

structa

; structb

; af(

const

a&); b

b; aa = f(b);

//錯誤,二義性,是呼叫的f(b::opreator a()),還是f(a::a(const b&))

出現二義性的時候可以顯示的指明呼叫的是那個

a a1 = f(b.opreator a());

a a2 = f(a(b));

定義內建型別時的二義性

structa

; 過載函式與型別轉換建構函式

structc

; structd

; void

manip(

const

c&);

void

manip(

const

d&);

manip(10);

//二義性錯誤 manip(c(10))還是manip(d(10));

manip(c(10));

//可通過顯示指明呼叫

函式過載與型別轉換

structe

; void

manip2(

const

c&);

void

manip2(

const

e&);

manip2(10);

//二義性錯誤 manip(c(10))還是manip(e(double(10)));

函式匹配和過載運算子

就是再定義過載運算子時和型別轉換運算子時的二義性問題

struct

data ;

data d1;

intx = d1 + 0;

//二義性錯誤

使用的是內建型別的+,還是operator+

可以把0轉換成data,然後使用data的+;或者把d1轉換成int。如果沒定義data+的話就沒有這個二義性。

C 型別轉換運算子過載

在c 中有乙個特殊的運算子過載方法 型別轉換運算子過載,形如 operator type code class cdemo operator int private int x int y code int tmain int argc,tchar argv 執行結果 即 x的值,int 對demo...

型別轉換 運算子過載

c 中沒有返回型別的函式有3個,建構函式 析構函式 型別轉換函式。operator const char const 如果是過載 的話,那應該寫成 const char operator const而上面所寫的那樣,而且即使是這樣寫那也不正確的,因為運算子過載中有幾個運算子的返回值是有格式的 約定 ...

C 運算子過載轉換運算子

為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...