前面介紹了運算子過載有兩種實現方法:成員函式和友元函式
一句話總結:當兩種方法都能實現運算子過載時,請使用成員函式這種方式實現,忘了友元函式。
那麼友元函式的出現是為了解決什麼難題的?
友元函式總結
1.為什麼有友元函式?
在實現類之間資料共享時,減少系統開銷,提高效率。
下面兩種情況需要使用友元函式:(1)運算子過載的某些特殊場合需要使用友元函式。(2)兩個類要共享資料的時候。
2.友元函式缺點
friend關鍵字實際上是編譯器開的後門,為執行特殊任務出現的。
友元函式破環了封裝機制,盡量不使用友元函式,除非不得已的情況下才使用友元函式
3.友元函式的位置與呼叫
位置:為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段,沒有區別
呼叫:可以直接調用友元函式,不需要通過物件或類名,可以當做是全域性函式來理解。
4.與成員函式的區別
由於不是成員函式,類似全域性函式,友元函式是不能被繼承的,就像父親的朋友未必是兒子的朋友
場景1:
complex c(10,20);
cout
<<(complex & c);
問題出來了,沒有辦法在ostream類中去增加過載《的函式。
實際上,只要是左運算元的抽象類無法得到,就沒有辦法通過成員函式這種方式來實現運算子的過載。這種情況下就只能使用友元函式這種方式來實現運算子的過載了。
函式原型如下:
void
friend
operator
<<(ostream& out,complex& c);
模擬實現:
void
friend
operator
<<(ostream& out,complex& c)
{ out<2:
cout
<"111";
要支援鏈式程式設計,需要對函式返回值做手腳。
friend ostream& operator
<<(ostream& out,complex& c);
說明:函式返回值當左值時,要求返回乙個引用或位址(需要再分配記憶體空間)
C 運算子過載 過載特殊運算子
賦值運算子用於同類物件間的相互賦值。賦值運算子只能被過載為類的非靜態成員函式,不能過載為友元函式和普通函式。對於使用者自定義的類而言,如果沒有過載賦值運算子,那麼c 編譯器會為該類提供乙個預設的過載賦值運算子成員函式。預設賦值運算子的工作方式是按位對拷,將等到右邊物件的非靜態成員拷貝給等號左邊的物件...
C 運算子過載賦值運算子
自定義類的賦值運算子過載函式的作用與內建賦值運算子的作用類似,但是要要注意的是,它與拷貝建構函式與析構函式一樣,要注意深拷貝淺拷貝的問題,在沒有深拷貝淺拷貝的情況下,如果沒有指定預設的賦值運算子過載函式,那麼系統將會自動提供乙個賦值運算子過載函式。賦值運算子過載函式的定義與其它運算子過載函式的定義是...
C 運算子過載轉換運算子
為什麼需要轉換運算子?大家知道對於內建型別的資料我們可以通過強制轉換符的使用來轉換資料,例如 int 2.1f 自定義類也是型別,那麼自定義類的物件在很多情況下也需要支援此操作,c 提供了轉換運算子過載函式 它使得自定義類物件的強轉換成為可能。轉換運算子的生命方式比較特別,方法如下 operator...