C 友元函式

2021-07-05 17:32:27 字數 3412 閱讀 3380

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開始,它只能出現在類定義的內部,友...