運算子過載是c++多型的重要實現手段之一。通過運算子過載對運算子功能進行特殊定製,使其支援特定型別物件的運算,執行特定的功能,增強c++的擴充套件功能。
運算子過載的我們需要堅持四項基本原則:
(1)不可臆造運算子;
(2)運算子原有運算元的個數、優先順序和結合性不能改變;
(3)運算元中至少乙個是自定義型別;
(4)保持過載運算子的自然含義。
一般來說,c++運算子過載可採用成員函式和友元函式,二者都可以訪問類的私有成員,那麼該採用哪一種呢?首先看一下二者的區別。
(1)當過載為成員函式時,會隱含乙個this指標;當過載為友元函式時,不存在隱含的this指標,需要在引數列表中顯示地新增運算元。
(2)當過載為成員函式時,只允許右引數的隱式轉換;當過載為友元函式時,能夠接受左引數和右引數的隱式轉換。
如下**:
class cstring;
因為cstring的構造函式引數為乙個char*,所以如果採用友元形式的operator +(const cstring&, const cstring&),那麼char+cstring和cstring+char都能正常工作;而如果採用成員函式形式cstring::operator+(const cstring& rhs),則只能接受cstring+char,如果執行char+cstring則會編譯出錯。我們往往習慣cstring+char和char+cstring都應該被接受。需要注意的是,隱式轉換由於臨時變數的增加往往效率不高。如果應用程式對效率要求較高,針對以上類,建議選擇定義多個運算子的友元過載版本:
cstring& operator +(const cstring&, const cstring&);
cstring& operator +(const char*, const cstring&);
cstring& operator +(const cstring&, const char*);
一般而言,對於雙目運算子,最好將其過載為友元函式;而對於單目運算子,則最好過載為成員函式。
但是也存在例外情況。有些雙目運算子是不能過載為友元函式的,比如賦值運算子=、函式呼叫運算子()、下標運算子、指標運算子->等,因為這些運算子在語義上與this都有太多的關聯。比如=表示「將自身賦值為…」,表示「自己的第幾個元素」,如果將其過載為友元函式,則會出現語義上的不一致。
還有乙個需要特別說明的就是輸出運算子<<。因為《的第乙個運算元一定是ostream型別,所以《只能過載為友元函式,如下:
friend ostream& operator <<(ostream& os, const complex& c);
ostream& operator <<(ostream& os, const complex& c)
參考文獻
[1]李健.編寫高質量**:改善c++程式的150個建議.第一版.北京:機械工業出版社,2012.1:131-134
C 運算子過載形式 成員函式or友元函式
一般來說,c 運算子過載可採用成員函式和友元函式,二者都可以訪問類的私有成員,那麼該採用哪一種呢?首先看一下二者的區別。如下 class string 因為string的構造函式引數為乙個char 所以如果採用友元形式的friend string operator const string a,co...
成員運算子過載函式與友元運算子過載函式的比較
1 對雙目運算子而言,成員運算子過載函式引數表中含有乙個引數,而友元運算子過載函式引數表中含有兩個引數 對單目運算子而言,成員運算子過載函式引數表中沒有引數,而友元運算子過載函式引數表中含有兩個引數。2 雙目運算子一般可以被過載為友元運算子過載函式或成員運算子過載函式,但有一種情況,必須使用友元函式...
類成員函式形式的運算子過載
新的概念 類成員函式形式的運算子過載 運算子過載的方法是定義乙個過載運算子的函式。運算子函式過載一般有兩種形式 過載為類的成員函式和過載為類的非成員函式。成員函式形式的運算子過載函式定義的一般形式為 返回型別說明符 operator 運算子符號 參數列 當運算子過載為成員函式時,函式的引數個數比原來...