1.友元函式的簡單介紹
1.1為什麼要使用友元函式
在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員(例如:智慧型指標類的實現),那麼類a中該函式要是類b的友元函式。具體來說:為了
使其他類的成員函式直接訪問該類的私有變數。即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。
實際上具體大概有下面兩種情況需要使用友元函式:(1)運算子過載的某些場合需要使用友元。(2)兩個類要共享資料的時候。
1.2使用友元函式的優缺點
1.2.1優點:能夠提高效率,表達簡單、清晰。
1.2.2缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。
2.友元函式的使用
2.1友元函式的引數:
因為友元函式沒有this指標,則引數要有三種情況:
2.1.1 要訪問非static成員時,需要物件做引數;
2.1.2 要訪問static成員或全域性變數時,則不需要物件做引數;
2.1.3 如果做引數的物件是全域性物件,則不需要物件做引數;
2.2友元函式的位置
因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。
2.3友元函式的呼叫
可以直接調用友元函式,不需要通過物件或指標
2.4友元函式的分類:
2.4.1普通函式友元函式
2.4.1.1 目的:使普通函式能夠訪問類的友元
2.4.1.2 語法:
宣告: friend + 普通函式宣告
實現位置:可以在類外或類中
實現**:與普通函式相同
呼叫:類似普通函式,直接呼叫
2.4.1.3**:
class integer ;2.4.2類y的所有成員函式都為類x友元函式—友元類void print(const integer& obj)
void main()
2.4.2.1目的:使用單個宣告使y類的所有函式成為類x的友元,它提供一種類之間合作的一種方式,使類y的物件可以具有類x和類y的功能。
2.4.2.2語法:
宣告位置:公有私有均可,常寫為私有(把類看成乙個變數)
宣告: friend + 類名(不是物件哦)
2.4.2.3**:
class girl;main函式就不寫了和普通呼叫時一樣的。class boy ;
void boy::disp(girl &x) //函式disp()為類boy的成員函式,也是類girl的友元函式
class girl ;
2.4.3類y的乙個成員函式為類x的友元函式
2.4.3.1目的:使類y的乙個成員函式成為類x的友元,具體而言:在類y的這個成員函式中,借助引數x,可以直接以x的私有變數
2.4.3.2語法:
宣告位置:宣告在公有中 (本身為函式)
宣告:friend + 成員函式的宣告
呼叫:先定義y的物件y---使用y呼叫自己的成員函式---自己的成員函式中使用了友元機制
2.4.3.3**:
實現**和2.4.2.3中的實現及其相似只是設定友元的時候變為friend void boy::disp(girl &);自己解決嘍……
小結:其實一些操作符的過載實現也是要在類外實現的,那麼通常這樣的話,宣告為類的友元是必須滴。
4.友元函式和類的成員函式的區別
4.1 成員函式有this指標,而友元函式沒有this指標。
4.2 友元函式是不能被繼承的,就像父親的朋友未必是兒子的朋友。
關於C 中的友元函式的總結
1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保...
關於C 中的友元函式的總結
1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變數和保...
關於C 中的友元函式的總結
原文 1.友元函式的簡單介紹 1.1為什麼要使用友元函式 在實現類之間資料共享時,減少系統開銷,提高效率。如果類a中的函式要訪問類b中的成員 例如 智慧型指標類的實現 那麼類a中該函式要是類b的友元函式。具體來說 為了 使其他類的成員函式直接訪問該類的私有變數。即 允許外面的類或函式去訪問類的私有變...