二元運算子過載

2021-07-31 16:26:10 字數 4521 閱讀 3895

------------------siwuxie095

二元運算子過載

所謂 二元運算子,即 這個符號與兩個運算元進行運算

(1)加號 + 的過載

加號 + 的過載方式有兩種:一種是友元函式過載,一種是成員函式過載

1)先來看成員函式過載,如下:

定義乙個座標類:coordinate

在類中宣告成員函式 operator+(),它的引數是 const coordinate &coor

在實現時:

首先需要定義乙個臨時物件 temp,傳入物件 coor 的 m_ix 要和

當前物件的

m_ix 相加,賦值給臨時物件 temp 的 m_ix,而對於

m_iy 同理 … 最後將 temp 作為返回值返回出去

在使用時:

定義 3 個 coordinate 的物件 coor1、coor2、coor3,用 coor3 來 接收

coor1 與 coor2 相加的和,這裡的加號 + 就已經用到了運算子

過載,相當於

coor1.operator+(coor2)

注意:在加號 + 的過載函式 operator+() 的傳入引數 coor2 的前面,

其實有乙個**引數

this,而 this 就相當於傳入的第乙個引數 coor1

2)再來看友元函式過載,如下:

友元函式過載相對於成員函式過載來說,更能說明問題:

通過friend 宣告將全域性函式 operator+() 宣告為友元函式,它的兩個

引數分別為:const coordinate &c1和 const coordinate &c2

其中,const 可寫可不寫,如果寫上,那麼在 operator+() 中就不能再

修改c1 和 c2 的值了,其實在做加法,即 讓乙個數與另乙個數相加時,

我們也不希望在加的過程當中去修改加數本身的值

所以,加

const 其實是一種設計上的規範

在實現時:

也需要定義乙個臨時物件 temp,傳入引數為 c1 和 c2,c1 的 m_ix

與 c2 的 m_ix 相加,賦值給 temp 的 m_ix,對於 m_iy 同理 … 最後 將

temp 作為返回值返回出去

在使用時:

使用時,其實和成員函式的加號 + 運算子過載是一樣的,仍然要定義

3 個coordinate 的物件 coor1、coor2、coor3,將 coor1 與 coor2

相加的和賦值給 coor3,其實就相當於呼叫 operator+(coor1,coor2)

(2)輸出符號 << 的過載

將輸出符號 << 的過載宣告為友元函式 operator<

必須是ostream&,它的第乙個引數也必須是乙個

ostream 的引用,

第二個引數是要進行輸出的物件

或引用(引用效率更高)

在實現時:

將 ostream 的物件引用 out替代原來寫成 cout 的位置,其他寫法不變,

分別輸出

m_ix 和 m_iy 的值,並一定要將 out 作為返回值返回出去

在使用時:

定義乙個 coordinate 的物件 coor,通過 cout 就可以直接輸出 coor 的

m_ix 和 m_iy,如果不進行運算子過載,這樣寫肯定是錯誤的,進行運算

符過載之後,這樣寫就相當於

operator<

通過這個例子,從側面也能看出: cout 其實就是乙個物件,並且是乙個

ostream 型別的物件

那麼,輸出運算子可以採用成員函式進行過載嗎?

從成員函式過載的特點說起:

如果使用成員函式過載,如:上面的加號

+ 運算子的過載,傳入的

只有乙個引數,這個引數其實是第二個加數,第乙個加數預設就是

**的this指標,即 當前物件

可是,對於輸出運算子來說,第乙個引數必須是

ostream 的引用,

這就意味著第乙個引數不能是**的

this 指標,二者是相衝突的

所以,當過載輸出運算子

<< 時,絕對不可以通過成員函式進行

過載,必須使用友元函式進行過載

(3)索引符號 的過載

索引運算子 更多的運用在陣列上,這裡先運用到

coordinate 類中:

在宣告時,將之作為乙個成員函式放在類中,定義方法:operator()

因為它是索引,所以要傳入乙個

int 型的變數作為索引,而返回值

要麼是m_ix,要麼是 m_iy

在實現時:

判斷傳入的

index 引數:

如果等於 0,就將 m_ix 作為返回值返回出去,如果等於 1,就將 m_iy

作為返回值返回出去,如果是其他值,暫不處理,實際上應該丟擲異常

在使用時:

定義乙個

coordinate 的物件 coor,如果通過 cout 輸出 coor 的

0 號元素,即 輸出橫座標 m_ix,如果輸出 coor 的 1 號元素,即

輸出縱座標 m_iy

當呼叫 coor 接索引時,其實就相當於呼叫 coor.operator()

那麼,索引運算子可以採用友元函式進行過載嗎?

答案是否定的,不能採用友元函式進行過載。原因是友元函式過載,

它的第乙個引數可以是成員函式過載中的**

this指標,也可以是

其它值

但作為索引運算子來說,

它的第乙個引數必須是

this 指標,因為

只有第乙個引數是

this 指標,才能夠傳入索引,並使得這個索引

所表達的是當前物件中的資料成員

所以,索引運算子必須採用成員函式進行過載,無法使用友元函式

進行過載

程式:

coordinate.h:

#ifndef coordinate_h

#define coordinate_h

#include

using namespacestd;

classcoordinate

;#endif

coordinate.cpp:

#include"coordinate.h"

#include

coordinate::coordinate(intx, inty)

intcoordinate::getx()

intcoordinate::gety()

//coordinate coordinate::operator+(coordinate &c)

//coordinate operator+(coordinate &c1, coordinate &c2)

//因為使用了

ostream

類在標頭檔案要包含

#include

ostream &operator<

//注意返回型別是

int型

intcoordinate::operator(intindex)

if(1== index)

//如果既不是

0 也不是

1 就應該丟擲異常}

main.cpp:

#include"stdlib.h"

#include"coordinate.h"

intmain(void)

【made by siwuxie095】

C 二元運算子過載

二元運算子需要兩個引數,下面是二元運算子的例項。我們平常使用的加運算子 減運算子 乘運算子 和除運算子 都屬於二元運算子。就像加 運算子。下面的例項演示了如何過載加運算子 類似地,您也可以嘗試過載減運算子 和除運算子 include using namespace std class box voi...

C 之運算子過載(二元)

一 加號 1.成員函式過載 2.友元函式過載 二 輸出符號 三 索引符號 四 補充說明 一 為什麼 運算子的過載必須定義為友元 如果在類中定義非友元成員函式,預設第乙個引數缺省會傳入this 指標,這時就無法實現cout在前 物件在後的格式 因為二元運算子中的呼叫格式是 引數一 運算子 引數二 這也...

二元加運算子

減法,乘法,除法在運算過程中,都是先將運算元,轉成數值,再進行後續操作,而加法,卻有所不一樣。當兩個數值相加時,加法運算子,跟減法操作符一樣,直接求和。var a 1 var b 2 a b 3當兩個字串相加時,加法運算子,這表現為字串拼接。var a 1 var b 2 a b 12 注意 只有有...