C 物件導向程式設計《三》 操作符過載

2021-07-10 02:19:32 字數 3508 閱讀 1718

先看程式

inline

complex&

_doapl(complex* ths, const

complex& r) //do assignment plus

inline

complex&

complex::operator += (const

complex& r)

使用如下

complex c1(2,1);

complex c2(5);

c2 += c1 ;

上面的形式是操作符過載,那麼c2 += c1是怎麼被編譯器看待的?見下

inline

complex&

complex::operator += (this, const

complex& r)

//c2相當於this,c1相當於r,相當於c2.operator += (c1);

所有的成員函式函式都帶著乙個隱藏的引數this指標。

為什麼過載+=運算子,返回值是complex&而不是void,如對於:c2 += c1 根本不需要知道返回值,但是如果對於:c3 += c2 += c1,這樣的形式如果返回值void就會出錯了,所以這裡的返回值是complex。

先看使用

complex c1(2,1);

complex c2;

c2 = c1 + c2;//兩個複數相加

c2 = c1 + 5;//複數加實數

c2 = 7 + c1;//實數加複數

對於上述就有三種使用+=運算子的方法,因此得寫三個運算子過載函式。(根據使用方法寫函式原型)

inline complex operator + (const

complex& x, const

complex& y)

inline complex operator + (const

complex& x, double y)

inline complex operator + (const

complex& x, const

complex& y)

上訴**是從stl中拿出來的一部分原始碼。

為什麼把+過載函式設定為全域性函式,而不成員函式?若是+過載函式為全域性函式,就沒法考慮實數+複數和複數+實數的情況了,而只能考慮複數加實數的情況。若這樣做如下

inline

complex& complex::operator + (double y);

c1 + 3; //實際上如下:c1.operator+(3),但卻不能實現3.operator+(c1)

complex c1(2,1);

comlex c2;

cout

<< -c1;

cout

<< +c1;

其過載函式如下

inline

complex

operator + (const

complex& x)

inline

complex

operator - (const

complex& x)

正號和加號的過載函式,負號於減號過載函式,怎麼區分呢?靠引數的個數來區分不同的過載函式。

complex c1(2,1);

comlex c2;

cout

<< (c1 == c2);

cout

<< (c1 == 2);

cout

<< (0 == c2);

對應的有三種過載函式:

inline

bool

operator == (const

complex& x, const

complex& y)

inline

bool

operator == (const

complex& x, double y)

inline

bool

operator == (double x, const

complex& y)

complex c1(2,1);

comlex c2;

cout

<< (c1 != c2);

cout

<< (c1 != 2);

cout

<< (0 != c2);

過載函式如下:

inline

bool

operator != (const

complex& x, const

complex& y)

inline

bool

operator != (const

complex& x, double y)

inline

bool

operator != (double x, const

complex& y)

complex c1(2,1)

cout << c1 << conj(c1)

/*1.cout << c1左邊是cout,右邊是c1,因此可以決定《過載函式引數的第乙個引數(左邊)和第二個引數(右邊)的型別

2.先輸出c1,得到得結果還要繼續能夠接受conj(c1)

*/

過載函式如下:

inline complex conj (const

complex& x) // 共軛複數

ostream& operator << (ostream& os, const

complex& x)

/*可以看出cout是個物件,其型別是ostream。*/

但若這樣寫過載函式

void

operator

<< (ostream& os, const

complex& x)

就不能像下面這樣用了

complex c1(2,1)

cout << c1 << conj(c1)

//此句會出錯

操作符的過載一定是作用在左邊運算元的。會把《符號作用在左邊身上。不要把《操作符寫成成員函式,一定要寫成全域性的函式。解釋下:

//若把《過載為成員函式,那就得這樣使用,顯然不會這樣使用

complex& complex:: operator

<< (ostream& os)

c1 << cout;

操作符過載(三)

目錄前面兩次筆記都是c 中可以過載且無 的操作符,本次筆記比較特殊,主要列出兩個c 語法允許過載 但在工程中不應該 不允許 過載的操作符 這兩個操作符在工程中不允許過載的原因是 過載後無法完全實現操作符的原生語義。先來回憶一下邏輯操作符的原生語義 c 語法是允許過載邏輯操作符的,看下面的示例 inc...

C 操作符過載

1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...

C 過載操作符

過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...