c 學習之 友元

2021-09-09 05:15:57 字數 1435 閱讀 3295

1.為什麼要用友元及其缺點

2.友元函式

3.友元類

一、為什麼要用友元和其缺點?

—採用類的機制後實現了資料的隱藏與封裝,類的資料成員一般定義為私有成員,成員函式一般定義為公有的,依此提供類與外界間的通訊介面。有時候,其他類或者函式要訪問該類的非公有成員,可以令其他類或者函式成為它的友元(friend)來實現。這樣做提高了程式的執行效率,但同時也壞了類的封裝性和隱藏性,使得非成員函式或其他類可以訪問類的私有成員。

二、友元函式

友元定義格式如下:

friend 型別 函式名(形參);

首先,友元函式可以訪問類的私有成員,其本身是定義在類外的普通函式,但是友元宣告只能出現在類定義的內部,同時因為,友元不是類的成員也不受它所在區域訪問控制級別的約束,其出現的位置不定,即既可以出現在private下也可以在public下;其次,若類想把乙個函式作為它的友元,只需增加一條以friend關鍵字開頭的函式宣告語句即可。如:

1 class sales_data2;

67/*非成員函式的宣告*/

8 sales_data add

(const sales_data&

,const sales_data&

);

這裡值得注意的幾點是:

(1)友元的宣告僅僅指定了訪問的許可權,而非乙個通常意義上的函式宣告,如果我們希望類的使用者能夠呼叫某個友元函式,那麼我們就必須在友元宣告之外再專門針對函式進行一次宣告。為了使友元對類的使用者可見,我們通常把友元的宣告與類的本身放置在同乙個標頭檔案中(類的外部)。

(2)友元函式的呼叫與一般函式的呼叫方式和原理一致。

(3)類和非成員函式的宣告不是必須在它們的友元宣告之前。

(4)友元函式能定義在類的內部,這樣的函式是隱式內聯的。

三、友元類

1、類之間的友元關係

如果希望乙個類可以訪問另乙個類的非公有成員在內的所有成員(主要是非公有的成員),可以將乙個類指定為另一類的友元類。

如將類b定義為類a的友元類:

1 class a

2;

這裡使用友元類有幾點要注意的:

(1)友元關係不存在傳遞性,即每個類負責控制自己的友元類或者友元函式;

(2)友元關係是單向的,不具有交換性。若類b是類a的友元,類a不一定是類b的友元,要看在類中是否有相應的宣告。

(3)友元關係不能被繼承。

2、成員函式作為友元

即乙個類的成員函式作為另乙個類的友元。此時,我們必須指出該成員函式屬於哪個類。

1 class a

2

這裡指明函式add是類b的成員函式。

這裡有一點要注意的是 b::add必須在a類之前被宣告;

C 學習筆記之 友元

我們知道類具有封裝和資訊隱藏的特性。只有類的成員函式才能訪問類的私有成員,程式中的其他函式是無法訪問私有成員的。非成員函式可以訪問類中的公有成員。有時候我們又需要其他非成員函式訪問類的成員,並且對於該成員我們不希望它是公有的 有可能這是危險的操作,我們希望它只針對某些操作可見 如果將它定義為公有的明...

C 學習17之友元

includeusing namespace std 有時需要定義一些函式,這些函式不是類的一部分,但又需要頻繁地訪問類的資料成 員,這時可以將這些函式定義為該函式的友元函式。同類物件間無 異類物件間有友元 除了友元函式外,還有友元類,兩者統稱為友元。友元的作用是提高了程式的執行 效率 即減少了型別...

C 之「友元類」學習筆記

什麼是友元類 當乙個類b成為了另外乙個類a的 朋友 時,那麼類a的私有和保護的資料成員就可以被類b訪問。我們就把類b叫做類a的友元。友元類能做什麼 友元類可以通過自己的方法來訪問把它當做朋友的那個類的所有成員。但是我們應該注意的是,我們把類b設定成了類a的友元類,但是這並不會是類a成為類b的友元。說...