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而上面所寫的那樣,而且即使是這樣寫那也不正確的,因為運算子過載中有幾個運算子的返回值是有格式的 約定 ...