C 之友元函式

2022-02-03 06:31:56 字數 2594 閱讀 9167

1、為什麼要引入友元函式:在實現類之間資料共享時,減少系統開銷,提高效率

具體來說:為了使其他類的成員函式直接訪問該類的私有變數

即:允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式

優點:能夠提高效率,表達簡單、清晰

缺點:友元函式破環了封裝機制,盡量不使用成員函式,除非不得已的情況下才使用友元函式。

2、什麼時候使用友元函式:

1)運算子過載的某些場合需要使用友元。

2)兩個類要共享資料的時候

3、怎麼使用友元函式:

友元函式的引數:

因為友元函式沒有this指標,則引數要有三種情況:

要訪問非static成員時,需要物件做引數;--常用(友元函式常含有引數)

2、  要訪問static成員或全域性變數時,則不需要物件做引數

3、  如果做引數的物件是全域性物件,則不需要物件做引數

友元函式的位置:

因為友元函式是類外的函式,所以它的宣告可以放在類的私有段或公有段且沒有區別。 

友元函式的呼叫:

可以直接調用友元函式,不需要通過物件或指標

友元函式的分類:

根據這個函式的**不同,可以分為三種方法:

1、普通函式友元函式:

a) 目的:使普通函式能夠訪問類的友元

b) 語法:宣告位置:公有私有均可,常寫為公有

宣告: friend + 普通函式宣告

實現位置:可以在類外或類中

實現**:與普通函式相同(不需要加friend或類的作用域運算子::)

呼叫:類似普通函式,直接呼叫

class

integer

;void print(const integer& obj)//

不使用friend和類::

void

main()

2、類y的所有成員函式都為類x友元函式—友元類—友元類a中的所有成員函式都能夠訪問將a宣告為友元的私有成員

a)目的:它提供一種類之間合作的一種方式,使類y的物件可以具有類x和類y的功能

具體來說:

前提:a是b的友元(=》a中成員函式可以訪問b中有所有成員,包括私有成員和公有成員)

b)語法:宣告位置:公有私有均可,常寫為私有(把類看成乙個變數)

friend + 類名

---此時宣告的是類,而不是物件哈

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呼叫自己的成員函式---自己的成員函式中使用了友元機制

class

girl;

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...