張 捷
(黃岡職業技術學院 黃岡 438002)
運算符重載是對已有的運算符賦予多重含義,使同一個運算符作用于不同類型的表達式的行為。運算符重載的實質就是函數重載。在實現過程中,首先把指定的運算符表達式轉化為對運算符函數的調用,運算對象轉化為運算符函數的實參,然后根據實參的類型來確定需要調用的函數,這個過程是在編譯過程中完成的。
例如:用“+”運算符完成兩個實數、兩個復數、兩個字符串的相關運算。兩個實數a=10,b=2,則兩個實數相加的結果是:a+b=10+2=12;兩個復數:a=10+2i,b=2+10i,則兩個復數相加的結果是:a+b=12+12i;兩個字符串:a=“visual”,b=“ studio”,則兩字符串連接的結果是:a+b=“visual studio”。由上例可以看出,同一個運算符“+”可以用于完成實數加法、復數加法及字符串連接等不同的運算,得到不同的結果。這就是“+”運算符的重載。因此,所謂的運算符重載就是用同一個運算符完成不同的運算操作。
對運算符進行重載需要遵守以下規則:
(1)重載運算符限制在C++語言中已有的并允許重載的運算符。C++中的運算符除五個運算符“.、* 、::、sizeof、?:”之外,其它都可重載。
(2)重載之后運算符的優先級和結合性均不改變。這就是說,對運算符重載不改變運算符的優先級和結合性,并且運算符重載時,單目運算符只能重載為單目運算符,雙目運算符只能重載為雙目運算符。
(3)不能改變運算符運算數的個數。在運算數中,至少有一個操作對象是自定義類型。
(4)重載運算含義必須清楚,不能產生二義性。運算符的重載實質是函數重載。運算符重載一般分兩種形式,即重載為類的成員函數和重載為類的友元函數,這兩種形式都可訪問類中的私有成員。
在C++中,運算符的重載有兩種方法:使用類的成員函數重載和使用fiend函數重載。下面通過實例來說明這兩種重載方法的實現。
1、 使用成員函數重載運算符
運算符重載函數為類的成員函數的常見格式為:
返回類型 類名::operator重載運算符(參數表)
{函數體}
其中,函數類型指定重載運算符的返回值類型;operator是定義運算符重載函數的關鍵字;運算符是要重載的運算符名稱;參數表中給出重載運算所需要的參數和類型。一般情況下,單目運算符采用成員函數形式重載時,操作數由對象的this指針給出,不需要參數;雙目運算符采用成員函數形式重載時,一個操作數是對象本身的數據,由this指針指出。參數表的參數為第二操作數,只需一個參數。總之,當運算符重載為類的成員函數時,除后置“++、--”外,函數的參數個數比原來的操作數個數少一個。
實例:定義一個復數類,重載“=”運算符,使這個運算符能直接完成復數的賦值運算。
#include
Calss complex
{private:
Float real,image;
Public:
Complex(float r=0,float i=0)
{real=r;image=i;}//缺省構造函數
Void show(int i) //顯示輸出復數
{count<<”c”<
Void operator=(complex&c)
{real=c.real;image=c.image;
}
};
Void main(void)
{complexc1(25,20),c2;
C1.show(1);
C2=c1;
C2.show(2);
}
程序執行后輸出:c1=25+50i c2=25+50i
該重載函數的函數名為“operator=”,返回類型為void,形參為復數類對象的引用complex&c。當程序執行主函數中的賦值語句c2=c1而遇到賦值運算符“=”時,自動調用賦值運算符“=”重載函數“operator=()”,并將“=”運算符右邊的操作數c1作為實參,左邊操作數c2作為調用重載函數的對象,即作了一次c2.operator=(c1)的函數調用。在函數的調用過程中,實參c1傳給形參c,在函數體內完成了復數實部與虛部的賦值操作。
2、 使用friend函數重載運算符
對于運算符op,如果它的一個操作數為類A的對象,就可以將運算符重載為A類的友元函數,該函數有兩個形參,其中一個形參的類型是A類。經過這樣的重載后,表達式k op t就相當于函數調用operator op(k,t)。與使用成員函數定義的方法相比較,友元函數的一般定義格式只是在前面多了一個關鍵字friend,其他項目含義相同,除格式差別外,友元函數不是k所在類的成員函數。運算符重載函數為友元函數的一般定義格式為:Friend類型operator重載運算符(參數表){函數體}
由于C++語言支持函數重載,所以才能將運算符當成函數來使用。但是在編程過程中要適當運用運算符重載:既不要因過分擔心自己不會用而不使用,它的本質仍然是程序員們熟悉的函數;也不要過度的使用,如果它不能使代碼變得更加易讀易寫,那就別用,否則會增加程序出錯的可能。同時在使用運算符的重載時還要注意如下問題:
■不能改變C++內部數據類型(如int,float等)的運算符
■不能重載“.”,因為“.”在類中對任何成員都有意義,已經成為標準用法。
■不能重載目前C++運算符集合中沒有的符號,如#,@,$等。原因有兩點,一是難以理解,而是難以確定優先級。
■對已經存在的運算符進行重載時,不能改變優先級規則,否則將引起混亂。
[1]蘭添才.C++中函數重載與操作符重載的應用探討[J].福建電腦,2003,(02).
[2]藍雯飛,陸際光.C++語言的重載機制剖析[J].微計算機應用,2000,(05).
[3]李 智.C++宏,函數重載與模板機制[J].電腦,1995,(05).
[4]李 智.C++函數重載與繼承機制的應用[J].中國金融電腦,1995,(08).
[5]沈慧娟.C++語言中運算符重載的應用研究[J].甘肅廣播電視大學學報,2006,(03).