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

