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

2021-06-18 14:50:55 字數 1293 閱讀 1731

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的好處.   

#includeusing namespace std;

class point

point(int vx,int vy):x(vx),y(vy){}//其實很像 int x(vx) int 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)

int main()

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

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

過載運算子以及友元函式

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

c 過載運算子 友元函式

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