C 的友元函式

2021-09-25 05:53:34 字數 2536 閱讀 9216

什麼是友元函式

①。乙個類的私有資料成員通常只能由類的函式成員來訪問,而友元函式可以訪問類的私有資料成員,也能訪問其保護成員。

②。友元函式不是任何類的成員函式,友元關係是指定的,不是獲取的,如果讓類b成為類a的友元類,類a必須顯式宣告類b為自己的友元類。

使用友元函式的好處

使用友元函式可提高效能,如:用友元函式過載操作符和生成迭代器類

用友元函式可以訪問兩個或多個類的私有資料,較其它方法使人們更容易理解程式的邏輯關係

使用友元函式的注意點

①。類的友元函式在類作用域之外定義

②。由於友元函式不是任何類的成員函式,所以不能用控制代碼(物件)加點操作符來呼叫

③。public, private, protected成員訪問符與友員關係的宣告無關,因此友元關係宣告可在類定義的任何位置,習慣上在類定義的開始位置

④。友元關係不滿足對稱性和傳遞性,如果乙個友元函式想與兩個或更多類成為友元關係,在每個類中都必須宣告為友元函式。同樣,如果乙個類想擁有多個友元函式,那麼需要對每個友元函式都宣告。

友元

類的主要特點之一是資料隱藏和封裝,即類的私有成員(或保護成員)只能在類定義的範圍內使用,也就是說私有成員只能通過他的成員函式來訪問。但是,有時為了訪問類的私有成員而需要在程式中多次呼叫成員函式,這樣會因為頻繁呼叫帶來較大的時間和空間開銷,從而降低程式的執行效率。

為此,c++提供了一種訪問私有成員的途徑,在不放棄私有成員資料安全性的情況下,使得乙個普通函式或者類的成員函式可以訪問到封裝於某一類的資訊(包括公有,私有,保護成員),在c++中友元作為實現這個要求的輔助手段。c++中的友元為資料隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視類內部的秘密,友元是一扇通向私有成員的後門。

友元包括友元函式和友元類,下面分別予以介紹。

友元函式:

友元函式既可以是不屬於任何類的成員函式,也可以是另乙個類的成員函式。友元函式不是當前類的成員函式,但它可以訪問該類所有的成員,包括私有成員,保護成員和公有成員。

在類中宣告友元函式時,需在其函式名前加上關鍵字friend。此宣告可以放在公有部分,可以放在保護部分和私有部分。友元函式可以定義在類內部,也可以定義在類外部。

①。友元函式雖然可以訪問類物件的私有成員,但它畢竟不是成員函式。因此,在類的外部定義友元函式時,不必像成員函式那樣,在函式名前加上"類名::",

②。因為友元函式不是類的成員,所以它不能直接訪問物件的資料成員,也不能通過this指標訪問物件的資料成員,它必須通過作為入口引數傳遞進來的物件名(或物件指標,物件引用)來訪問該物件的資料成員。

③。由於乙個友元函式可能屬於多個不同的類,所以在訪問時,必選加上物件名。

④。友元提供了不同類的成員函式之間,類的成員函式與一般函式之間進行資料共享的機制。尤其當乙個函式需要訪問多個類時,友元函式非常有用,普通成員函式只能訪問其所屬的類,但是多個類的友元函式能夠訪問相關的所有類的資料。

被定義成類的友元函式後,它能夠訪問類的所有資料(包括私有資料)。應該指出的是,引入友元提高了程式執行效率,實現了類之間的資料共享並方便了程式設計。但是,宣告友元函式相當於在實現封裝的黑盒子上開洞,如果乙個類宣告了許多友元,則相當於在黑盒子上開了很多洞,顯然這將破壞資料的隱蔽性和類的封裝性,降低了程式的可維護性,這與物件導向程式設計思想是背道而馳的,因此使用友元函式應謹慎。

將成員函式宣告為友元函式

除了非成員函式可以作為某個類的友元外,乙個類的成員函式也可以作為另乙個類的友元,它是友元函式的一種,稱為友元成員函式。友元成員函式不僅可以訪問自己所在類物件中的私有成員和公有成員,還可以訪問friend宣告語句所在類物件中的所有成員,這樣能使兩個類相互合作,協調工作,完成某一任務。

①。乙個類的成員函式作為另乙個類的友元函式時,必須先定義這個類。如類student的成員函式為類score的友元函式,必須先定義類student。並且在宣告友元函式時,要加上成員函式所在類的類名,如:friend void student::showscore_student(score& sc);

②。程式中第四行語句「class score;」為score類的提前引用宣告,因為函式中將"score &"作為引數,而score要在晚一些時候才被定義。

友元類

不僅可以將乙個函式宣告為乙個類的友元函式,而且可以將乙個類(如y類)宣告為另乙個類(如x類)的友元,這時,y類就是x類的友元。友元類的說明方法是在另乙個類宣告中加入語句"friend 類名:",此語句可以放在公有部分也可以放在私有部分或保護部分。宣告友元類的一般形式為:

friend 類名;

例如:classy;

class

x;

①。友元關係是單向的,不具有交換性。若宣告了類x是類y的友元(即在類y定義中宣告x為friend類),不等於類y一定是x的友元,這要看在類x中是否有相應的宣告。

②。友元關係也不具有傳遞性,若類x是類y的友元,類y是類z的友元,不一定類x是類z的友元。如果想讓類x是類z的友元類,應在類z中做出宣告。

C 友元函式 友元類 友元成員函式

眾所周知,c 控制對類物件私有部分的訪問。通常,公有類方法提供唯一的訪問途徑,但是有時候這種限制太嚴格,以至於不適合特定的程式設計問題。在這種情況下,c 提供了另外一種形式的訪問許可權 友元,友元有3種 友元函式 友元類 友元成員函式。通過讓函式成為類的友元 即 友元函式 可以賦予該函式與類的成員函...

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...

友元 友元函式 友元類和友元成員函式 C

有些情況下,允許特定的非成員函式訪問乙個類的私有成員,同時仍阻止一般的訪問,這是很方便做到的。例如被過載的操作符,如輸入或輸出操作符,經常需要訪問類的私有資料成員。友元 frend 機制允許乙個類將對其非公有成員的訪問權授予指定的函式或者類,友元的宣告以friend開始,它只能出現在類定義的內部,友...