------------------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 注意 只有有...