友元C BULIDER講稿

2022-12-11 07:18:04 字數 2869 閱讀 3289

友元類的主要特點之一是資料隱藏,即類的私有成員只能在類定義的範圍內使用,也就是說私有成員只能通過它的成員函式來訪問。但是,有時候需要在類的外部訪問類的私有成員。為此,就需要尋找一種途徑,在不放棄私有資料安全性的情況下,使得類外部的函式或類能夠訪問類中的私有成員,在c++中就用友元作為實現這個要求的輔助手段。

c++中的友元為資料隱藏這堵不透明的牆開了乙個小孔,外界可以通過這個小孔窺視類內部的秘密,友元是一扇通向私有成員的後門。

友元既可以是不屬於任何類的一般函式,也可以是另乙個類的成員函式,還可以是整個的乙個類(這樣,這個類中的所有成員函式都可以成為友元函式)。

3.6.1 友元函式

友元函式不是當前類的成員函式,而是獨立於當前類的外部函式,但它可以訪問該類的所有物件的成員,包括私有成員和公有成員。

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

下面是乙個使用友元函式的例子。

例3.1

#include<>

#include<>

class girl

friend void disp(girl宣告友元函式

~girl()

};void disp(girl &x定義友元函式

void main()

程式的執行結果如下:

girl's name is:chen xingwei,age:18

從上面的例子可以看出,友元函式可以訪問類物件的各個私有資料。若在類girl的宣告中將友元函式的宣告語句去掉,那麼函式disp()對類物件的私有資料的訪問將變為非法的。

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

(2)友元函式一般帶有乙個該類的入口引數。因為友元函式不是類的成員,所以它不能直接引用物件成員的名字,也不能通過this指標引用物件的成員,它必須通過作為入口引數傳遞進來的物件名或物件指標來引用該物件的成員。

例如上面例子中的友元函式void disp(girl &x)就帶有該類的乙個入口引數。

(3)當乙個函式需要訪問多個類時,友元函式非常有用,普通的成員函式只能訪問其所屬的類,但是多個類的友元函式能夠訪問相應的所有類的資料。

例如有boy和girl兩個類,現要求列印出所有的男生和女生的名字和年齡,我們只需乙個獨立的函式prdata()就能夠完成,但它必須同時定義為這兩個類的友元函式。下例給出了這樣的乙個程式。

例3.2

#include<>

#include<>

class boy; //向前引用

class girl;

void girl::init(char n,int a)

class boy;

void boy::init(char n,int a)

void prdata(const girl plg,const boy plb) //定義友元函式prdata()

void main ( )

程式執行結果如下;

name:stacy

age:12

name:jim

age:11

name:judith

age:13

name:michael

age:13

name:leah

age:12

name:larry

age:12

程式中的第3行是由於第9行的要求而存在的。因為友元函式帶了兩個不同的類的物件,其中乙個是類boy的物件,而類boy要在晚一些時候才被宣告。為了避免編譯時的錯誤,程式設計時必須通過向前引用(forward reference)告訴c++類boy將在後面定義。

在向前引用類宣告之前,可以使用該類宣告引數,這樣第9行就不會出錯了。

prdata()是程式中的乙個獨立函式,可以被main()或其它任意函式呼叫。但由於它被定義成類boy和類girl的友元函式,所以它能夠訪問這兩個類中的私有資料。

⑷友元函式通過直接訪問物件的私有成員,提高了程式執行的效率。在某些情況下,如運算子被過載時,需要用到友元。但是友元函式破壞了資料的隱蔽性,降低了程式的可維護性,這與物件導向的程式設計思想是背道而馳的,因此使用友元函式應謹慎。

3.6.2 友元成員

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

在例3.3所列的程式中,宣告了disp()為類boy的成員函式,又是類girl的友元函式。

例3.3

#include<>

#include<>

class girl;

class boy

void disp(girl宣告disp()為boy的成員函式

~boy()

};class girl

friend void boy::disp(girl &); //宣告boy的成員函式disp()為girl的友元函式

~girl()

};void boy::disp(girl &x) //定義友元函式disp()

void main()

程式執行結果如下:

boy's name is:chen hao,age:25

girl's name is:zhang wei,age:18

說明:(1)乙個類的成員函式作為另乙個類的友元函式時,必須先定義這個類。例如上例中,類boy的成員函式為類girl的友元函式,必須先定義類boy。

並且在宣告友元函式時,要加上成員函式所在類的類名,如:

friend void boy::disp(girl&);

4 私有資料成員和友元

一 私有資料成員的使用 1.取值和賦值成員函式 物件導向的約定就是保證所有資料成員的私有性。一般我們都是通過公有成員函式來作為公共介面來讀取私有資料成員的。某些時候,我們稱這樣的函式為取值和賦值函式。取值函式的返回值和傳遞給賦值函式的引數不必一一匹配所有資料成員的型別。include class d...

實驗8c 函式過載和友元函式

實驗8 friends,overloaded operators 4 lab hours 1 實驗目的 1 學習如何進行運算子過載。2 掌握友元的使用。2 實驗要求 1 認真閱讀和掌握本實驗內容所給的全部程式。2 編寫本實驗中的程式並上機除錯通過。3 實驗內容 1 按照練習ste 4的要求,編寫程式...

Student類 友元,運算子過載,繼承 綜合題

void display輸出函式 void input輸入函式 void min student int 求最低成績函式 void sort student int 按照成績高低排序函式 protected這裡是保護成員 這裡是vc6.0的原因 string num 學號 string name 姓...