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