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...