成員函式過載運算子和友元函式過載運算子的比較

2021-07-10 02:44:48 字數 1277 閱讀 5190

1.對雙目

運算子而言,成員

函式過載

運算子的函式引數表中只有乙個引數,而用友元函式過載運算子函式引數表中含有兩個引數。

對單木運算子來說,成員函式過載運算子的函式引數表中沒有引數,而用友元函式過載運算子函式引數表中含有乙個函式。這個問題要搞清楚,有乙個this

指標的問題。。。

2.雙目運算子一般可以用友元函式過載和成員函式過載,但有一種情況只可以用友元函式過載。

即:雙目運算子左邊的變數是乙個常量,而不是物件!!!這點很重要的額。

書上推薦的一般經驗:

1.對於單目運算子,建議選擇成員函式;

2.對於運算子「=,(),,->」只能作為成員函式;

3.對於運算子「+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=」建議過載為成員函式;

4.對於其他運算子,建議過載為友元函式。

對於class中將operator函式定義為friend主要有以下考慮:

1.friend function是對外公開的,而class method是屬於物件的,有些情況呼叫不方便

2.對某些需要兩個引數的operator function,定義friend比較方便,如下例中operator <<

3.所有class   method必須有匹配的左值型別進行呼叫而friend則無需這樣,只要能隱式轉化成當前型別就可以呼叫該函式,因此如下例建構函式沒有定義為explicit的,可以進行隱式轉化,就可以在不同型別間運算。   

下面的例子可以很好的說明定義為friend   function的好處.   

#include  

class   point   

point(int   vx,int   vy):x(vx),y(vy){}   

friend   point   operator   +(point   p1,point   p2);   

friend   ostream   &   operator   <<(ostream   &output,point   &p1);   

};   

point   operator   +(point   p1,point   p2)   

ostream   &   operator   <<(ostream   &output,point   &p1)

{   

output<

;//如果定義為class   method,編譯將出錯!類提供了相應的建構函式,且非explicit

cout<

from:  

成員函式過載運算子和友元函式過載運算子的比較

1.對雙目 運算子而言,成員 函式過載 運算子的函式引數表中只有乙個引數,而用友元函式過載運算子函式引數表中含有兩個引數。對單木運算子來說,成員函式過載運算子的函式引數表中沒有引數,而用友元函式過載運算子函式引數表中含有乙個函式。這個問題要搞清楚,有乙個this 指標的問題。2.雙目運算子一般可以用...

過載運算子以及友元函式

在自己已經創造好的類中如果想更加簡化一些運算,比如之前兩個類中的物件如果想要相加必須通過類成員函式來實現,現在假設之前建立好的time類中的兩個物件 time a time b timec c a b 如果想實現上述運算,就要求過載運算子 利用關鍵字operator來實現。首先在標頭檔案中就要宣告過...

c 過載運算子 友元函式

運算子的過載使得我們可以更加方便的使用常見的運算子進行操作。過載運算子的函式格式如下 operatorop argement list 接下來的例子中,我們將定義乙個time類,並通過過載運算子 和 來實現時間的加法和輸出顯示,其中會使用友元函式 friend ifndef time h defin...