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

2021-09-07 15:26:32 字數 1938 閱讀 5219

(1)對雙目運算子而言,成員運算子過載函式引數表中含有乙個引數,而友元運算子過載函式引數表中含有兩個引數;對單目運算子而言,成員運算子過載函式引數表中沒有引數,而友元運算子過載函式引數表中含有兩個引數。

(2)雙目運算子一般可以被過載為友元運算子過載函式或成員運算子過載函式,但有一種情況,必須使用友元函式:

例如,如果將乙個複數與乙個整數相加,可用成員運算子函式過載 「+」:

complex operator+(

int a)

若 com 和 com1 是類 complex 的物件,則以下語句是正確的:

com1=com+

100;

這條語句被 c++ 編譯系統解釋為:

com1=com.

operator+(

100)

;

由於物件 com 是運算子 「+」 的左運算元,所以它可以呼叫 「+」運算子過載函式 operator+,執行結果是物件 com 的資料成員 real 被加上乙個整數 100。

然而,下面的語句是錯誤的:

com1=

100+com;

//編譯錯誤,運算子 + 的左側是整數

這條語句被 c++ 編譯系統解釋為:

com1=

100.

operator

+(com)

;

由於運算子 「+」 的左運算元是乙個整數 100,而不是該類的物件,編譯時將出現錯誤。

如果定義一下的兩個友元運算子過載函式:

friend complex operator

+(complex com,

int a)

friend complex operator

+(complex com,

int a)

當乙個複數與乙個整數相加時,無論整數出現在左側還是右側,使用友元運算子過載函式都能得到很好的解決。

例 1:使用友元運算子過載函式實現乙個複數與乙個整數相加。

#include

using

namespace std;

class

complex

friend complex operator+(

int a,complex com)

void

show()

;};complex::

complex

(int r,

int i)

void complex::

show()

intmain()

(3)成員運算子函式和友元運算子函式都可以用習慣方式呼叫,也可以用它們專用的方式呼叫,下面列出了一般情況下運算子函式的呼叫形式:

習慣呼叫形式

友元運算子過載函式呼叫形式

成員運算子過載函式呼叫形式

a+boperator+(a,b)

a.operator+(b)

-aoperator-(a)

a.operator-()

a++operator++(a,0)

a.operator++(0)

(4)c++ 的大部分運算子既可說明為成員運算子過載函式,又可說明為友元運算子過載函式。取決於實際情況和習慣來選擇合適的運算子函式。

一般而言,對於雙目運算子,將它過載為友元運算子比重載為成員運算子便於使用。對於單目運算子,則選擇成員運算子較好。如果運算子所需的運算元(尤其是第乙個運算元)希望有隱式型別轉換,則運算子過載必須用友元函式。以下的經驗可供參考:

運算子過載,友元函式

運算子過載 include using namespace std class cint cint const cint timp public cint operator const cint timp const cint add const cint timp const cint add c...

運算子過載與友元

參考 c primer plus 第六版 先給段 include include using namespace std class time void addmin int m void addhr int h void reset int h 0,int m 0 time sum const t...

友元運算子過載

運算子就是一種特殊的函式 運算子過載可以是普通函式 const money operator const money a1,const money a2 可以是成員函式 const money operator const money a2 const 當二元運算子作為成員函式進行過載時,只有乙個引...