1、為什麼要引入友元函式:在實現類之間資料共享時,減少系統開銷,提高效率
具體來說:為了使其他類的成員函式直接訪問該類的私有變數
即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式
優點:能夠提高效率,表達簡單、清晰
缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。
2、什麼時候使用友元函式:
1)運算子過載的某些場合需要使用友元。
2)兩個類要共享資料的時候
3、怎麼使用友元函式:
友元函式的引數:
因為友元函式沒有this指標,則引數要有三種情況:
要訪問非static成員時,需要物件做引數;--常用(友元函式常含有引數)
2、 要訪問static成員或全域性變數時,則不需要物件做引數
3、 如果做引數的物件是全域性物件,則不需要物件做引數
友元函式的位置:
因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。
友元函式的呼叫:
可以直接調用友元函式,不需要通過物件或指標
友元函式的分類:
根據這個函式的**不同,可以分為三種方法:
1、普通函式友元函式:
a) 目的:使普通函式能夠訪問類的友元
b) 語法:宣告位置:公有私有均可,常寫為公有
宣告: friend + 普通函式宣告
實現位置:可以在類外或類中
實現**:與普通函式相同(不需要加friend或類的作用域運算子::)
呼叫:類似普通函式,直接呼叫
classinteger
;void print(const integer& obj)//
不使用friend和類::
void
main()
2、類y的所有成員函式都為類x友元函式—友元類—友元類a中的所有成員函式都能夠訪問將a宣告為友元的私有成員
a)目的:它提供一種類之間合作的一種方式,使類y的物件可以具有類x和類y的功能
具體來說:
前提:a是b的友元(=》a中成員函式可以訪問b中有所有成員,包括私有成員和公有成員)
b)語法:宣告位置:公有私有均可,常寫為私有(把類看成乙個變數)
friend + 類名
---此時宣告的是類,而不是物件哈
classgirl;
class
boy;
void boy::disp(girl &x) //
函式disp()為類boy的成員函式,也是類girl的友元函式
class
girl
; void
main()
3、類y的乙個成員函式為類x的友元函式
a)目的:使類y的乙個成員函式成為類x的友元
具體而言:而在類y的這個成員函式中,借助引數x,可以直接訪問x中的私有變數
b)語法:宣告位置:宣告在公有中 (本身為函式)
宣告:friend + 成員函式的宣告
呼叫:先定義y的物件y---使用y呼叫自己的成員函式---自己的成員函式中使用了友元機制
classgirl;
class
boy;
class
girl
;
void boy::disp(girl &x)
void
main()
4、在模板類中使用友元operator<<(對《運算子的過載)
a)使用方法:
在模板類中宣告:
friend ostream& operator<< <>(ostream& cout,const mgraph& g);
在模板類中定義:
templateostream& operator<<(ostream& cout,const mgraph&g)
b)注意:
把函式宣告非模板函式:
friend ostream& operator<< (ostream& cout,const mgraph& g);
把函式宣告為模板函式:
friend ostream& operator<< <>(ostream& cout,const mgraph& g);
說明:在函式宣告中加入operator<< <>:是將operator《函式定義為函式模板,將函式模板申明為類模板的友員時,是一對一繫結的
實際的宣告函式:這裡模板引數可以省略,但是尖括號不可以省略
friend ostream& operator<< (ostream& cout,const mgraph& g);
5、友元函式和類的成員函式的區別:成員函式有this指標,而友元函式沒有this指標。
6、記憶:a是b的友元《=》a是b的朋友《=》借助b的物件,在a中可以直接 通過b.成員變數(可以是公有,也可以為私有變數) 的方式訪問b
C 之友元函式
類的友元.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std class point 預設賦值建構函式,在建立物件時自動呼叫 int getx 隱藏有this指標,指向當前使用的物件,其實是return thi...
C 遠征之友元函式篇
相信大家都會有點小疑問?何為友元函式難道是friend?那麼他又是怎樣定義的呢?表現形式是什麼?關鍵字又是什麼呢?友元函式與類的成員函式區別?下面就一一給大家介紹一下揭秘中。友元函式的定義 c 程式設計中如果需要訪問非本類的私有成員,那麼就需要用到友元。否則私有成員是無法被外部直接訪問的,而友元可以...
C 學習之友元函式(一)
本文是學習慕課網c 遠征之模板類.友元函式分為友元全域性函式和友元成員函式 友元全域性函式 將函式定義在全域性,並在類中宣告為友元 友元成員函式 將函式定義在類當中,並把函式宣告為另外乙個類的友元函式 兩個都可以直接訪問類的私有成員 1 友元全域性函式 先來看一段 include using nam...