1、為什麼要引入友元函式:在實現類之間資料共享時,減少系統開銷,提高效率
具體來說:為了使其他類的成員函式直接訪問該類的私有變數
即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式
優點:能夠提高效率,表達簡單、清晰
缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。
2、什麼時候使用友元函式:
1)運算子過載的某些場合需要使用友元。
2)兩個類要共享資料的時候
3、怎麼使用友元函式:
友元函式的引數:
因為友元函式沒有this指標,則引數要有三種情況:
1、 要訪問非static成員時,需要物件做引數;--常用(友元函式常含有引數)
2、 要訪問static成員或全域性變數時,則不需要物件做引數
3、 如果做引數的物件是全域性物件,則不需要物件做引數
友元函式的位置:
因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。
友元函式的呼叫:
可以直接調用友元函式,不需要通過物件或指標
友元函式的分類:
根據這個函式的**不同,可以分為三種方法:
1、普通函式友元函式:
a) 目的:使普通函式能夠訪問類的友元
b) 語法:宣告位置:公有私有均可,常寫為公有
宣告: friend + 普通函式宣告
實現位置:可以在類外或類中
實現**:與普通函式相同(不加不用friend和類::)
呼叫:類似普通函式,直接呼叫
c) **:
[cpp]view plain
copy
class
integer
; void
print(
const
integer& obj)
//不使用friend和類::
void
main()
2、類y的所有成員函式都為類x友元函式—友元類
a)目的:使用單個宣告使y類的所有函式成為類x的友元
它提供一種類之間合作的一種方式,使類y的物件可以具有類x和類y的功能
具體來說:
前提:a是b的友元(=》a中成員函式可以訪問b中有所有成員,包括私有成員和公有成員--老忘)
則:在a中,借助類b,可以直接使用~b . 私有變數~的形式訪問私有變數
b)語法:宣告位置:公有私有均可,常寫為私有(把類看成乙個變數)
宣告: friend + 類名
---不是物件啊
呼叫:c)**:
[cpp]view plain
copy
class
girl;
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呼叫自己的成員函式---自己的成員函式中使用了友元機制
c)**:
[cpp]view plain
copy
class
girl;
class
boy
;
class
girl
;
void
boy::disp(girl &x)
void
main()
4、在模板類中使用友元operator<<(對《運算子的過載)
a)使用方法:
在模板類中宣告:
[cpp]view plain
copy
friend
ostream& operator<< <>(ostream& cout,
const
mgraph& g);
在模板類中定義:
[cpp]view plain
copy
template
<
class
vextype,
class
arctype>
ostream& operator<<(ostream& cout,const
mgraph& g)
b)注意:
把函式宣告非模板函式:
[cpp]view plain
copy
friend
ostream& operator<< (ostream& cout,
const
mgraph& g);
把函式宣告為模板函式:
[cpp]view plain
copy
friend
ostream& operator<< <>(ostream& cout,
const
mgraph& g);
或:[cpp]view plain
copy
friend
ostream& operator<< (ostream& cout,
const
mgraph& g);
說明:在函式宣告中加入operator<< <>:是將operator《函式定義為函式模板,將函式模板申明為類模板的友員時,是一對一繫結的
實際的宣告函式:這裡模板引數可以省略,但是尖括號不可以省略
[cpp]view plain
copy
friend
ostream& operator<< (ostream& cout,
const
mgraph& g);
5、友元函式和類的成員函式的區別:成員函式有this指標,而友元函式沒有this指標。
6、記憶:a是b的友元《=》a是b的朋友《=》借助b的物件,在a中可以直接 通過b。成員變數(可以是公有,也可以為私有變數) 的方式訪問b
C 友元函式 友元類 友元成員函式
眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...
友元 友元函式 友元類和友元成員函式 C
有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...