友元函式 友元類

2021-05-28 00:39:22 字數 2542 閱讀 8732

friend class

1.友元函式

2.友元類

友元函式與友元類。

c++中以關鍵字friend宣告友元關係。友元可以訪問與其有friend關係的 類中的私有成員。友元包括友元函式和友元類。

1.友元函式

如果在本類以外的其它地方定義了乙個函式(這個函式可以是不屬於任何類的非成員函式,也可以是其它類的成員函式),在類體中用friend對該函式進行宣告,此函式就稱為本類的友元函式。乙個類的友元函式可以訪問這個類中的private成員。

1.1將全域性函式宣告為友元函式

如果要將乙個全域性函式(call)宣告為本類(time)的友元函式,則只需要在本類的函式宣告部分宣告該函式為friend。此時,該函式可以訪問本類的private成員。

class time; 

time::time(int h,int m,int s) 

void call(time &t)  

int main()

1.2友元成員函式

如果需要將目標類(time)中的成員函式(call)宣告為本類(date)的友元函式,則需要在本類的函式宣告部分宣告該函式為friend。此時,該函式可以訪問本類的private成員。

class date; //對date類的提前引用宣告 

class time; 

class date; 

time::time(int h,int m,int s) 

void time::call(date &d)  

date::date(int m,int d,int y) 

int main()

這裡還做了對類的提前引用宣告。

1.3關於類的提前引用宣告

一般情況下,類必須先宣告(給出類體),才能使用。如果需要在類宣告之前,使用該類的名字去定義指向該類物件的指標或引用,可以使用提前引用宣告。如上例所示,

class date; //對date類的提前引用宣告 

… void call(date &);//date類的引用 

… class date//date類的宣告

但不能因為提前引用宣告,而去定義乙個類的物件,這是不允許的。

class date; 

//緊接著馬上定義乙個date類的物件 

date d1;error:aggregate `date d1' has incomplete type and cannot be defined 

… class date

在定義物件時要為這些物件分配儲存空間,在正式宣告類之前,編譯系統無法確定應為物件分配多大的儲存空 間。編譯系統只有見到「類體」之後才能確定應該為物件預留多大的空間。所以不能在宣告類之前,先定義乙個該類的物件。但是可以在宣告類之前,先使用該類的 名字定義乙個該類的指標或引用。因為指標變數和引用本身的大小是固定的,它與指向的類物件的大小無關。

1.4將乙個函式宣告為多個類的友元函式

在這種情況下,該函式可以同時訪問多個類的private成員。

class date; //對date類的提前引用宣告 

class time; 

class date; 

time::time(int h,int m,int s) 

date::date(int m,int d,int y) 

void call(time &t,date &d)  

int main()

2.友元類

可以將乙個類(b)宣告為當前類(a)的友元。此時,當前類(a)的友元類(b)中的所有成員函式都是當前類的友元函式,可以訪問當前類的private成員。

class date; //對date類的提前引用宣告 

class time; 

class date; 

time::time(int h,int m,int s) 

date::date(int m,int d,int y) 

void date::call_hour(time &t) 

void date::call_min(time &t) 

void date::call_sec(time &t) 

int main()

注意[1]友元的關係是單向的。如果宣告類b是類a的友元類,則類b中的成員函式可以訪問類a中的private成員,但類a中的成員函式不能訪問類b中的private成員。

[2]友元的關係不能傳遞。如果類b是類a的友元類,類c是類b的友元類,不等於類c是類a的友元類。

remark:關於誰在前面的問題,就是在宣告變數的時候需要對變數進行instantiation,也就是說,對於pointer和reference來說,只需要定義本身的記憶體位址就好,並沒有對類進行解析。而定義class object的時候則需要整個類的實體,也就是defination

故而在使用類的時候,必須要看到類的實體,也就是說看到類的整個概況。並不需要整個實現。故而,僅僅的class ***是不行的。也就是使用真個類的declareation。

不管是friend還是derived。但是對於friend類,可以知道,必須讓被friend的類前面有定義。但對於friend function 則必須把引用該類的函式放在後面。

友元(友元函式 友元類 類成員函式的友元)

friend 友元機制 允許乙個類將對其非公有成員的訪問許可權授予指定的函式或者類。我們可以將友元大致分為3類 友元函式 是指某些雖然不是類的成員函式,但是能夠訪問這個類的所有成員的函式。比如我們下列的 include class test friend void show test rhs 宣告 ...

友元函式 友元類 友元成員

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

友元函式 友元類

1 友元函式不是成員函式,它是類的朋友,因此可以訪問類的全部成員 三種都可以 2 友元的宣告部位是任意的,定義可以在類外也可以在類內 3 友元的使用 乙個友元函式訪問兩個類的成員 兩邊都進行宣告,這樣函式就可以直接訪問兩個類的成員了 class vector class matrix 乙個類的成員函...