在 C 的類中定義乙個 operator 為什麼要用 friend 宣告?

時間 2021-06-01 13:44:34

1樓:Milo Yip

因為二元運算子過載(binary operator overloading)以某個類的成員函式形式實現時,左運算數必然為該型別。

問題中的:

Complex

operator+(

int&i);

為 Complex 的成員函式,所以它過載的是 Complex + int 運算。

但由於一般的加法是對稱的,過載了 Complex + int 運算,應該也過載 int + Complex 運算,否則 1 + Complex() 不能通過編譯。後者不能以成員函式形式實現,只能以非成員函式形式實現。

而使用友元(friend)是為了讓該函式可以訪問 Complex 的非 public 成員。

另乙個問題是 const-ness,這個運算不會改變運算數的值,所以應該宣告常數函式和常數引用引數:

Complex

operator+(

const

int&i)

const

;friend

Complex

operator+(

const

int&

,const

Complex&);

int 這類原生型別可選擇以值傳參(不過使用引用也沒問題):

Complex

operator+(

inti

)const

;friend

Complex

operator+(

int,

const

Complex&);

最後,一般實數(real number)會使用 float 或 double 型別,按你的 Complex::real 和 imag,相信此運算也使用 double 作為引數型別。

C 如何在類中定義乙個 C 函式(不用傳遞 this,非友元,非靜態)?

悽臨雨 無捕獲的lambda,可以轉型為c函式指標。類內巢狀類可以定義靜態函式 不一定合乎要求 但據我所知都只能獲取指標,沒辦法定義c函式 因為c函式應當處在c的命名空間中 陸海綿 使用函式指標成員指向乙個類外定義的C函式。extern c class Avoid p int 實在想不到哪種應用場景...

C 中如何由乙個指向派生類物件的基類指標轉殖乙個相同的派生類物件,假設派生類有拷貝建構函式?

張小飛 原來自己實現的原型者模式 手機編輯,也不知道啥效果 include stdafx.h include include include include using namespace std 父類 class Resume virtual Resume virtual Resume Clone...

c 在類內 宣告乙個新類 怎麼解決變數不完整的問題 宣告在hpp定義在cpp)

luckybat 這個問題的根源在於 不完全類,只能宣告為其他類的指標或引用 因為編譯器不知道不完全類的size,因此就不能處理包含它的類的size 而指標或引用的尺寸是固定的,都是sizeof void 建議不要這樣寫,我個人覺得特別彆扭呢 山楂山楂片 簡而言之,題主需要把CameraDevice...