8.1 運(yùn)算符函數(shù)與運(yùn)算符重載
考點(diǎn)1 運(yùn)算符函數(shù)與運(yùn)算符重載的概念
運(yùn)算符重載就是賦予已有的運(yùn)算符多重含義。C++通過(guò)重新定義運(yùn)算符,使它能夠作用于特定的對(duì)象,從而執(zhí)行特定的功能。因?yàn)槿魏芜\(yùn)算都是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的,所以運(yùn)算符重載其實(shí)就是函數(shù)重載。我們把重載的運(yùn)算符視為特殊的函數(shù),稱為運(yùn)算符函數(shù)因此,運(yùn)算符重載就是函數(shù)重載的一種特殊情況。C++的運(yùn)算符大部分都可以重載,不能重載的只有‘“.”,“::”,“.*”,“->*”,“?:”。除了new和delete之外,任何運(yùn)算符作為成員函數(shù)重載時(shí),不得重載為static函數(shù)?! perator是C ++的一個(gè)關(guān)鍵字,它經(jīng)常和C++的一個(gè)運(yùn)算符連用,構(gòu)成一個(gè)運(yùn)算符函數(shù)名,例如:operator +,重載運(yùn)算符函數(shù)為operator +()。一般說(shuō)來(lái),要在C ++中重載運(yùn)算符@,只需要定義一個(gè)名為operator@的函數(shù)就可以了,具體的格式為:
TYPE operator@(參數(shù)表){
…//函數(shù)定義
}
小提示:
這里的TYPE是函數(shù)的返回類型,運(yùn)算符函數(shù)的返回類型不能是void類型。
考點(diǎn)2 運(yùn)算符重載應(yīng)注意的幾個(gè)問(wèn)題
運(yùn)算符重載應(yīng)注意的幾個(gè)問(wèn)題如下:
(1)運(yùn)算符重載后的優(yōu)先級(jí)。用戶重新定義運(yùn)算符,不改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,也不改變運(yùn)算符的語(yǔ)法結(jié)構(gòu),即單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載為雙目運(yùn)算符。
(2)對(duì)運(yùn)算符重載的限制。不可臆造新的運(yùn)算符;不能改變運(yùn)算符操作數(shù)的個(gè)數(shù);不能改變運(yùn)算符原有的優(yōu)先級(jí)、結(jié)合性和語(yǔ)法結(jié)構(gòu)。
(3)運(yùn)算符重載時(shí)必須遵循的原則。運(yùn)算符重載含義必須清楚;運(yùn)算符重載不能有二義性。
(4)編譯程序運(yùn)算符函數(shù)的選擇。編譯程序?qū)\(yùn)算符重載的選擇,遵循著函數(shù)重載的選擇原則。當(dāng)遇到不明顯的運(yùn)算符時(shí),編譯程序?qū)⑷ふ遗c參數(shù)相匹配的運(yùn)算符函數(shù)。
考點(diǎn)3 運(yùn)算符重載函數(shù)的兩種形式
運(yùn)算符重載的函數(shù)一般有兩種形式:成員函數(shù)形式和友元函數(shù)形式。這兩種形式都可以訪問(wèn)類中的私有成員
(l)將運(yùn)算符重載函數(shù)說(shuō)明為類的成員函數(shù)的格式如下:
<類名>operator<運(yùn)算符>(<參數(shù)表>)
其中,成員函數(shù)有隱含參數(shù)的this指針,一般是指第1個(gè)操作數(shù)。對(duì)雙目運(yùn)算符,有1個(gè)參數(shù),一般指第2個(gè)操作數(shù);對(duì)單目運(yùn)算符,參數(shù)表為空。
(2)將運(yùn)算符重載函數(shù)說(shuō)明為類的友元函數(shù)的格式如下:
friend<類名>operator<運(yùn)算符>(<參數(shù)表>)
其中,友元函數(shù)沒(méi)有隱含參數(shù)的this指針。因此,對(duì)雙目運(yùn)算符,友元函數(shù)有2個(gè)參數(shù);對(duì)單目運(yùn)算符,友元函數(shù)有1個(gè)參數(shù)。
8.2 典型運(yùn)算符的重載
考點(diǎn)4 幾種典型運(yùn)算符的重載
1.重載取負(fù)運(yùn)算符“-”
取負(fù)運(yùn)算符“-”是一元運(yùn)算符,當(dāng)作為成員函數(shù)重載時(shí)參數(shù)表中沒(méi)有參數(shù),那個(gè)惟一的操作數(shù)以this指針的形式隱藏在參數(shù)表中。當(dāng)把取負(fù)運(yùn)算符作為非成員函數(shù)重載時(shí),那個(gè)惟一的操作數(shù)必須出現(xiàn)在參數(shù)表中。“-”是一個(gè)典型的一元運(yùn)算符,除了++、--外的其他一元運(yùn)算符的用法與此類似。例如把取負(fù)運(yùn)算符“-”當(dāng)成員函數(shù)重載:類名operator-(){//函數(shù)體}。
2.重載加法運(yùn)算符“+”
加法運(yùn)算符“+”是一個(gè)二元運(yùn)算符,當(dāng)作為成員函數(shù)重載時(shí)參數(shù)表中只有1個(gè)參數(shù),對(duì)應(yīng)于第二個(gè)操作數(shù),而第一個(gè)操作數(shù)是對(duì)象本身,以this指針的形式隱藏在參數(shù)表中。當(dāng)把加法運(yùn)算符作為非成員函數(shù)重載時(shí),兩個(gè)操作數(shù)必須都出現(xiàn)在參數(shù)表中?!?”是一個(gè)典型的二元運(yùn)算符,除了賦值類運(yùn)算符外的其他二元運(yùn)算符的用法與此類似例如把加法運(yùn)算符“+”作為友元函數(shù)重載的聲明形式:
friend類名operator+(參數(shù)1,參數(shù)2){//函數(shù)體}
3.重載運(yùn)算符“++”和“- -”
C++中提供了一元自加(十+)與自減運(yùn)算符(一)的前綴運(yùn)算和后綴運(yùn)算,兩者之間的差別在于說(shuō)明的格式不同,對(duì)于++而言:
函數(shù)類型operator + +()//前綴運(yùn)算
函數(shù)類型operator++(int) //后綴運(yùn)算
由于在后綴情況下不需要使用形參,因此在函數(shù)定義中,只給出類型而沒(méi)有指定形參名,這是C++所允許的另外需要注意的是,若將++重載為友元運(yùn)算符,由于它們要修改操作數(shù),所以必須使用引用參數(shù)。對(duì)于--來(lái)說(shuō),與++的用法完全一樣。
4.重載類型轉(zhuǎn)換并“l(fā)ong”類型轉(zhuǎn)換符必須作為成員函數(shù)重載。在重載類型轉(zhuǎn)換符時(shí),不需要返回值類型的聲明。
重載類型轉(zhuǎn)換符“l(fā)ong”的語(yǔ)法形式為:
operator long(參數(shù)表){//函數(shù)體}
其他類型轉(zhuǎn)換符的重載方法與此類似。
小提示:
=,[ ],(),->及所有的類型轉(zhuǎn)換運(yùn)算符只能作為成員函數(shù)重載,而且是不能針對(duì)枚舉類型操作數(shù)的重載。
考點(diǎn)1 運(yùn)算符函數(shù)與運(yùn)算符重載的概念
運(yùn)算符重載就是賦予已有的運(yùn)算符多重含義。C++通過(guò)重新定義運(yùn)算符,使它能夠作用于特定的對(duì)象,從而執(zhí)行特定的功能。因?yàn)槿魏芜\(yùn)算都是通過(guò)函數(shù)來(lái)實(shí)現(xiàn)的,所以運(yùn)算符重載其實(shí)就是函數(shù)重載。我們把重載的運(yùn)算符視為特殊的函數(shù),稱為運(yùn)算符函數(shù)因此,運(yùn)算符重載就是函數(shù)重載的一種特殊情況。C++的運(yùn)算符大部分都可以重載,不能重載的只有‘“.”,“::”,“.*”,“->*”,“?:”。除了new和delete之外,任何運(yùn)算符作為成員函數(shù)重載時(shí),不得重載為static函數(shù)?! perator是C ++的一個(gè)關(guān)鍵字,它經(jīng)常和C++的一個(gè)運(yùn)算符連用,構(gòu)成一個(gè)運(yùn)算符函數(shù)名,例如:operator +,重載運(yùn)算符函數(shù)為operator +()。一般說(shuō)來(lái),要在C ++中重載運(yùn)算符@,只需要定義一個(gè)名為operator@的函數(shù)就可以了,具體的格式為:
TYPE operator@(參數(shù)表){
…//函數(shù)定義
}
小提示:
這里的TYPE是函數(shù)的返回類型,運(yùn)算符函數(shù)的返回類型不能是void類型。
考點(diǎn)2 運(yùn)算符重載應(yīng)注意的幾個(gè)問(wèn)題
運(yùn)算符重載應(yīng)注意的幾個(gè)問(wèn)題如下:
(1)運(yùn)算符重載后的優(yōu)先級(jí)。用戶重新定義運(yùn)算符,不改變運(yùn)算符的優(yōu)先級(jí)和結(jié)合性,也不改變運(yùn)算符的語(yǔ)法結(jié)構(gòu),即單目運(yùn)算符只能重載為單目運(yùn)算符,雙目運(yùn)算符只能重載為雙目運(yùn)算符。
(2)對(duì)運(yùn)算符重載的限制。不可臆造新的運(yùn)算符;不能改變運(yùn)算符操作數(shù)的個(gè)數(shù);不能改變運(yùn)算符原有的優(yōu)先級(jí)、結(jié)合性和語(yǔ)法結(jié)構(gòu)。
(3)運(yùn)算符重載時(shí)必須遵循的原則。運(yùn)算符重載含義必須清楚;運(yùn)算符重載不能有二義性。
(4)編譯程序運(yùn)算符函數(shù)的選擇。編譯程序?qū)\(yùn)算符重載的選擇,遵循著函數(shù)重載的選擇原則。當(dāng)遇到不明顯的運(yùn)算符時(shí),編譯程序?qū)⑷ふ遗c參數(shù)相匹配的運(yùn)算符函數(shù)。
考點(diǎn)3 運(yùn)算符重載函數(shù)的兩種形式
運(yùn)算符重載的函數(shù)一般有兩種形式:成員函數(shù)形式和友元函數(shù)形式。這兩種形式都可以訪問(wèn)類中的私有成員
(l)將運(yùn)算符重載函數(shù)說(shuō)明為類的成員函數(shù)的格式如下:
<類名>operator<運(yùn)算符>(<參數(shù)表>)
其中,成員函數(shù)有隱含參數(shù)的this指針,一般是指第1個(gè)操作數(shù)。對(duì)雙目運(yùn)算符,有1個(gè)參數(shù),一般指第2個(gè)操作數(shù);對(duì)單目運(yùn)算符,參數(shù)表為空。
(2)將運(yùn)算符重載函數(shù)說(shuō)明為類的友元函數(shù)的格式如下:
friend<類名>operator<運(yùn)算符>(<參數(shù)表>)
其中,友元函數(shù)沒(méi)有隱含參數(shù)的this指針。因此,對(duì)雙目運(yùn)算符,友元函數(shù)有2個(gè)參數(shù);對(duì)單目運(yùn)算符,友元函數(shù)有1個(gè)參數(shù)。
8.2 典型運(yùn)算符的重載
考點(diǎn)4 幾種典型運(yùn)算符的重載
1.重載取負(fù)運(yùn)算符“-”
取負(fù)運(yùn)算符“-”是一元運(yùn)算符,當(dāng)作為成員函數(shù)重載時(shí)參數(shù)表中沒(méi)有參數(shù),那個(gè)惟一的操作數(shù)以this指針的形式隱藏在參數(shù)表中。當(dāng)把取負(fù)運(yùn)算符作為非成員函數(shù)重載時(shí),那個(gè)惟一的操作數(shù)必須出現(xiàn)在參數(shù)表中。“-”是一個(gè)典型的一元運(yùn)算符,除了++、--外的其他一元運(yùn)算符的用法與此類似。例如把取負(fù)運(yùn)算符“-”當(dāng)成員函數(shù)重載:類名operator-(){//函數(shù)體}。
2.重載加法運(yùn)算符“+”
加法運(yùn)算符“+”是一個(gè)二元運(yùn)算符,當(dāng)作為成員函數(shù)重載時(shí)參數(shù)表中只有1個(gè)參數(shù),對(duì)應(yīng)于第二個(gè)操作數(shù),而第一個(gè)操作數(shù)是對(duì)象本身,以this指針的形式隱藏在參數(shù)表中。當(dāng)把加法運(yùn)算符作為非成員函數(shù)重載時(shí),兩個(gè)操作數(shù)必須都出現(xiàn)在參數(shù)表中?!?”是一個(gè)典型的二元運(yùn)算符,除了賦值類運(yùn)算符外的其他二元運(yùn)算符的用法與此類似例如把加法運(yùn)算符“+”作為友元函數(shù)重載的聲明形式:
friend類名operator+(參數(shù)1,參數(shù)2){//函數(shù)體}
3.重載運(yùn)算符“++”和“- -”
C++中提供了一元自加(十+)與自減運(yùn)算符(一)的前綴運(yùn)算和后綴運(yùn)算,兩者之間的差別在于說(shuō)明的格式不同,對(duì)于++而言:
函數(shù)類型operator + +()//前綴運(yùn)算
函數(shù)類型operator++(int) //后綴運(yùn)算
由于在后綴情況下不需要使用形參,因此在函數(shù)定義中,只給出類型而沒(méi)有指定形參名,這是C++所允許的另外需要注意的是,若將++重載為友元運(yùn)算符,由于它們要修改操作數(shù),所以必須使用引用參數(shù)。對(duì)于--來(lái)說(shuō),與++的用法完全一樣。
4.重載類型轉(zhuǎn)換并“l(fā)ong”類型轉(zhuǎn)換符必須作為成員函數(shù)重載。在重載類型轉(zhuǎn)換符時(shí),不需要返回值類型的聲明。
重載類型轉(zhuǎn)換符“l(fā)ong”的語(yǔ)法形式為:
operator long(參數(shù)表){//函數(shù)體}
其他類型轉(zhuǎn)換符的重載方法與此類似。
小提示:
=,[ ],(),->及所有的類型轉(zhuǎn)換運(yùn)算符只能作為成員函數(shù)重載,而且是不能針對(duì)枚舉類型操作數(shù)的重載。

