C 程式設計必知 友元

2021-06-28 21:10:05 字數 1938 閱讀 9388

一種共享資料方式--友元。友元是一種破壞類的封裝性獲取類的隱藏資料的方式。

如果有以下程式:

class a

private:

int x;

};class b

;上面就是類的組合的形式。類b中包含乙個類a的物件作為資料成員。但是類b的成員函式不能直接訪問類a的私有資料成員x。比如下面類b的成員函式set的實現是不正確的:

void b::set(int y)

那麼怎樣實現b的成員函式直接訪問a的資料成員呢?c++提供了友元機制。

通過友元的方式,某個普通函式或者類的成員函式可以訪問某個類中的私有資料,這樣就等於在類的封裝的很好的外衣上剪開了乙個小洞,外界可以通過這個小洞訪問到一些類內部的資料。友元提供了一種不同類或物件的成員函式之間、類的成員函式與普通函式之間共享資料的機制。

它破壞了類的封裝性和類資料的隱藏性,但是又給我們進行

軟體開發

提供了很多方便,在我們實地進行軟體開發的時候可以自己在共享和封裝之間平衡一下,決定是否選擇使用友元,

原則上盡量少使用或不使用友元,除非確實很大的提高了開發效率。

在乙個類中宣告友元的方式是,用關鍵字friend把普通函式、其他類的成員函式或其他類宣告為此類的友元

,用friend宣告的元素就可以訪問此類的私有資料。

如果友元是普通函式或是類的成員函式就叫做友元函式,如果友元是乙個類則叫做友元類,友元類的所有成員函式均為友元函式。

1.友元函式

友元函式是在類的宣告中用關鍵字friend修飾的普通函式或者其他類的成員函式。友元函式雖不是本類的成員函式,但在它的函式體中可以訪問該類物件的私有成員和保護成員。舉個例子:

#include

#include

using namespace std;

class data //data類宣告

int getx()

friend int add(data &a, data &b); 

private: //私有資料成員

int x;

};int add(data &a, data &b)

int main()

程式執行結果是:the sum is 3

在data類中宣告友元函式add時只給出了友元函式原型,友元函式add的實現在類data外。

我們看到,

在add函式體中直接通過物件名訪問了data類的私有成員x,這就是友元的強大作用。

我們在類外用一般方式訪問x的話必須通過公共介面getx來實現,若要訪問的私有成員很多或者要訪問的地方很多就要多次呼叫函式,對於我們寫**和程式執行都有效率上的損失

,但是用友元也有個很大的缺點就是,如果私有資料x發生結構性的變化,那麼友元函式就要做相應的修改,所有調用友元函式的地方可能也要修改,這就降低了開發效率,所以是否要使用友元可以自己權衡。

上面例子中的友元函式是普通函式,這個函式也可以是其他類的成員函式,用法類似。

2.友元類

類也可以宣告為另乙個類的友元,就像友元函式那樣,這個作為另乙個類的友元的類就叫做友元類。

如果乙個類b是類a的友元類,則類b的所有成員函式都是類a的友元函式,都能訪問類a的私有成員和保護成員。

友元類的宣告形式為:

class a

上面宣告中,類b是類a的友元類,b的成員函式

可以訪問類a的物件的私有成員和保護成員。

class a

class b

;void b::set(int i)

void b::display()

友元關係不能傳遞,如果類b是類a的友元,類c又是類b的友元,類c和類a如果沒有宣告則沒有友元關係,另外,友元關係是單向的,如果類b是類a的友元,類b的成員函式

可以訪問類a物件的私有成員和保護成員,但是類a的成員函式不能訪問類b物件的私有成員和保護成員。

友元的知識大概就這些了,在使用的時候要綜合考慮封裝和共享之間的平衡,一般認為還是要盡量少使用友元。

c 模版元程式設計

編譯時計算階乘 includeusing namespace std templateclass factorial template class factorial 1 int main 編譯時展開迴圈 includeusing namespace std templateclass loop t...

C 模板元程式設計

原理 模板元程式由編譯器在編譯期解釋執行,利用模板特化機制實現編譯期條件選擇結構,利用遞迴模板實現編譯期迴圈結構。模板元程式設計 metaprogramming 意思是,程式設計系統將會執行我們所寫的 來生成新的 而這些新 才真正實現了我們所期望的功能。元程式設計最大的特點在於 某些使用者自定義的計...

C 模板元程式設計

昨天wl發給我一段我覺得很 奇怪 的c 當時沒看太懂,後來問了才知道是叫做模板元程式設計。template struct binary template specialization struct binary 0 terminates recursion 覺得很新奇,於是乎索要了一本電子書,名為 ...