運算子過載,什麼時候用友元?

2021-05-21 15:09:02 字數 586 閱讀 6751

過載ostream和istream運算子的時候,必須過載為友元,這是為什麼?

什麼時候應該用友元函式?什麼時候用成員函式?

有些操作必須是成員函式:比如建構函式,拷貝建構函式,析構函式以及虛函式

由於成員是區域性於類的,所以,這些函式還是優先被作為成員。

由此可見,修改乙個類物件狀態的操作,應該或者是乙個成員,或者是乙個帶有非

const引用引數的全域性函式。那些要求基礎型別的左值運算子作為使用者定義型別的成員函

數最為自然。

如果希望某個運算的所有運算物件都能允許隱式型別轉換,實現他的函式就應該作為

非成員函式,取const引用引數或非引用引數。在應用不需要基礎型別的左值的運算子(+,

-||等),顯示它們的函式通常採用這種方式。這些運算子經常需要訪問其運算物件類的內部

表示,因此,它們friend函式的最常見的**。

如果沒有定義型別轉換,選擇成員函式要比採用引用引數的友元函式更好

ps:如果過載為成員函式,編譯時就會產生以下錯誤:

error c2679: 二進位制「<<」: 沒有找到接受「mystring」型別的右運算元的運算子(或沒有可接受的轉換)

在運算子過載中使用友元函式

在運算子過載中使用友元函式實現複數的四則運算 include using namespace std class complex 使用初始化表初始化複數 complex double r,double i real r imag i friend complex operator complex c...

友元運算子過載

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

C 什麼時候呼叫拷貝建構函式 賦值運算子

class person 拷貝建構函式和賦值運算子的行為比較相似,都是將乙個物件的值複製給另乙個物件 但是其結果卻有些不同,拷貝建構函式使用傳入物件的值生成乙個新的物件的例項,而賦值運算子是將物件的值複製給乙個已經存在的例項。這種區別從兩者的名字也可以很輕易的分辨出來,拷貝建構函式也是一種建構函式,...