C 運算子過載和型別轉換函式

2021-08-16 09:27:13 字數 2945 閱讀 2124

c++中對於使用者自定義類物件的運算,要進行過載操作。如

class

overload;

overload o1, o2;

int num;

//要實現的加法操作如下:

/*1*/overload o3 = o1 + o2;

/*2*/overload o4 = o1 + (任意int型);

/*3*/overload o5 = (任意int型) + o2;

/*4*/num = (任意int型) + o2;

/*5*/num = o1 + o2;

//以及一些其他的組合,原理一致,此處不列出

首先要為類定義建構函式:

overload():num(0)

{}overload(int

a):num(a)

{}

對於1、2式,直接進行運算子的過載就行。系統會將o1+o2變為o1.operator+(o2)的形式。為了保持類的封裝性,最好是過載為成員函式。

//此過載可以相容1、2式

//對於2式中的int型整數,會通過乙個隱式轉換(建構函式中的overload(int a):num(a) {}),變為overload型別的物件,然後執行加操作

overload operator+(const overload &o)

//上式多一步隱式轉換,效能就會受到影響,所以可以採用專門的過載函式

overload operator+(const

int x)

ps:上述兩個過載返回值寫的都是建構函式型別,原因在於如果寫的是以下結構

overload res(num + x);

return res;

將會多出乙個隱式的構造和析構過程(區域性變數的拷貝引起),而直接返回建構函式,可以使此步驟發生在要賦值的類物件的記憶體空間中,減少構造和析構的過程。這叫做返回值優化(return value optimization)

對於3式,由於無法產生a.operator+(overator &)的型別,所以需要過載為友元函式,但是影響了一定的封裝性(因為類要求private的成員不可被外部訪問,只可以被內部訪問,而友元函式不屬於內部的函式)。

//友元函式

//第乙個友元函式多一步隱式轉換,第

二、三不會有隱式轉換,原理一致,寫哪個都可以

friend overload operator+(const overload &o1, const overload &o2)

friend overload operator+(const

int a, const overload &o2)

friend overload operator+(const overload &o1, const

int a)

但是如果這還不能滿足我們呢?如果我們要求類也可以轉換為int型的資料呢?(4,5式)

這就要用到型別轉換函式了。

型別轉換函式形式如下:

operator 型別名( )

在函式名前面不能指定函式型別,函式沒有引數。其返回值的型別是由函式名中指定的型別名來確定的。型別轉換函式只能作為成員函式,因為轉換的主體是本類的物件。不能作為友元函式或普通函式。

從函式形式可以看到,它與運算子過載函式相似,都是用關鍵字operator開頭,只是被過載的是型別名。int型別經過過載後,除了原有的含義外,還獲得新的含義(將乙個overload類物件轉換為int型別資料,並指定了轉換方法)。這樣,編譯系統不僅能識別原有的int型資料,而且還會把overload類物件作為int型資料處理。

本例的型別轉換函式如下:

operator

int()

這個型別轉換函式可以直接代替上述過載函式的功能,實現1,2,3,4,5式。

//o1,o2都轉換為int型別的資料,進行相加後,再通過隱式轉換,構造o3

overload o3 = o1 + o2;

overload o4 = o1 + (任意int型);

//沒有int+overload型別的加法,但是系統會自動將o2變為int型別,執行加法後再構造o5

overload o5 = (任意int型) + o2;

num = (任意int型) + o2;

//o1,o2的結果轉換為int

num = o1 + o2;

型別轉換運算子的功能:當需要的時候,編譯系統會自動呼叫這些函式,建立乙個無名的臨時物件(或臨時變數)。

但是當類中同時出現以上函式時,會出現二義性,程式無法判定使用哪一種轉換方法,所以需要自行選擇合適的方法。

實驗部分**如下:

#include 

using namespace std;

class overload

overload(int a):num(a) {}

#if 1

overload operator+(const overload &o)

#endif

#if 0

//型別轉換函式

operator

int()

#endif

//友元函式

friend ostream &operator

<<(ostream &out, const overload &o)

#if 1

friend overload operator+(const overload &o1, const overload &o2)

#endif

private:

int num;

};int main()

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 過載型別轉換運算子

型別轉換運算子 型別轉換運算子是類的一種特殊成員函式,負責將乙個類型別的值轉換成其他型別 乙個型別轉換函式必須是類的成員函式,不能有返回型別,形參列表也必須為空,通常是const的。operator type const class smallint 轉換源,為int型。可將算術型別轉換成small...

型別轉換 運算子過載

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