為什么要對運算符進行重載?
C++預(yù)定義中的運算符的操作對象只局限于基本的內(nèi)置數(shù)據(jù)類型,但是對于我們自定義的類型(類)是沒有辦法操作的。但是大多時候我們需要對我們定義的類型進行類似的運算,這個時候就需要我們對這些運算符進行重新定義,賦予新的功能,以滿足自身的需求。
C++運算符重載的實質(zhì):
運算符重載的實質(zhì)就是函數(shù)重載或函數(shù)多態(tài)。運算符重載是一種形式的C++多態(tài)。目的在于讓人能夠用同名函數(shù)來完成不同的基本操作。要重載運算符,需要使用被稱為運算符函數(shù)的特殊函數(shù)形式。
1. 輸入和輸出操作符
2. 算術(shù)操作符和關(guān)系操作符
3. 下標操作符
4. 自加、自減操作符
一、輸入輸出操作符
結(jié)果:
說明:
1) IO操作必須為非成員函數(shù)
原因:IO操作的接口返回的是ostream&對象(只有返回左值,這樣才能連續(xù)的輸出,例如cout << c1 << ',' << c2 )。自定義的輸出的操作符應(yīng)該與其相似。如果將其定義為成員函數(shù)(有個首默認參數(shù)this,既指向自己的指針),左操作數(shù)只能是該類型的對象,則沒法辦到。
2) 因為要訪問指定類的私有成員,所以在該類中聲明輸出操作符為友元函數(shù)。
3) 第一個形參必須為引用。因為IO對象不可以復(fù)制。同理返回值必須為一個引用。
4) 第一個形參不可以為const(針對于輸出),因為寫入到流會改變其值。
5) 第二個為引用,這樣可以避免復(fù)制。參數(shù)可以為const,可以接收const對象和非const對象;否則,如果為非const對象。一般為const,畢竟只是輸出而已,不改變對象。
注:輸入與輸出操作符的重要的區(qū)別:輸入操作符必須處理錯誤和文件結(jié)束的可能性。輸入如果有多個值的話,如果一個數(shù)錯了,則前邊賦值正確的已經(jīng)生效,后邊的用了默認值,可以這樣設(shè)計,如果輸入錯誤,將整個對象復(fù)位,恢復(fù)到最初的狀態(tài)。
結(jié)果:
二、算術(shù)操作符和關(guān)系操作符
? ? 1) 相等操作符
通過上面的實例可以看出,拷貝構(gòu)造和"="重載的結(jié)果是一樣的。在"="重載函數(shù)中返回 this指針是為了連續(xù)賦值,而拷貝構(gòu)造不需要此操作就可以實現(xiàn)連續(xù)賦值。還有就是重載函數(shù)有兩種形式,但是"="重載不能使用友元,這里要說明一下重載操作符的限制。
重載限制
a. 重載的操作符(部分除外)不必是成員函數(shù),但重載的操作符至少有一個用戶自定義的類,這是為了防止用戶為標準類型重載操作符,例如兩個整數(shù)的加法重載為乘法之類的;
b. 使用重載操作符不能違反原來的語法,例如不能把二元操作符重載為醫(yī)院操作符。同樣不能改變優(yōu)先級。
c. 不能定義新的操作符。
d. 并非所有的操作符都被重載下圖是一些常用的能被重載的操作符:
e. 大多數(shù)操作符都能通過成員或非成員函數(shù)重載,但以下操作符只能通過成員函數(shù)重載:
? ? --> ?= ? 賦值操作符
? ? --> ?() ?函數(shù)調(diào)用操作符
? ? --> ?[] ?下標操作符
? ? --> ?-> ?通過指針訪問類成員的操作符
假如我們重載了加法操作符,使得A+3能正常使用,那么如果是3+A呢?因為重載時規(guī)定+左邊是對象右邊是int,所以3+A是非法的。如何解決呢?
一般會使用友元。
友元有三種:友元類,友元函數(shù),友元成員函數(shù)。
1. 友元函數(shù)的創(chuàng)建:加上friend關(guān)鍵字,注意參數(shù)的數(shù)量。
? ? 雖然friend operator*(...) 函數(shù)在類中聲明的,但它不是成員函數(shù),不能使用成員操作符來調(diào)用;
? ? 雖然友元函數(shù)不是成員函數(shù),但它的訪問權(quán)限跟成員函數(shù)相同;????
? ? 友元函數(shù)的聲明放在共有段和私有段是一樣的。
2. 友元函數(shù)與成員函數(shù)的區(qū)別:
? ? 成員函數(shù)有this指針,而友元函數(shù)沒有this指針;
? ? 友元函數(shù)是不能被繼承的,就像父親的朋友未必是兒子的朋友。
三、下標操作符
結(jié)果:
u
下標操作必須為函數(shù)成員,因為傳遞一個參數(shù),還需要另一個指向自己的指針參數(shù),正好函數(shù)成員的this可以勝任。一般不要像上圖那樣,容易把自己搞糊涂。
四、前后++/--
它們的區(qū)別在于后++再函數(shù)中加入了啞元參數(shù)。
其他的就不進行總結(jié)了,如有興趣可以一起探討。