類容許其餘類或者函數訪問它的非公有成員,但咱們須要將訪問類非公有成員的其餘類或者函數成爲它的友元。
1、友元函數
若是類想要把一個函數做爲他的友元,只須要增長一條以 friend 關鍵字開始的函數聲明語句便可。
例如:函數
class A{
friend void fri_fun(A);
private:
int a=9;
};
void fri_fun(A aa){
cout<<aa.a<<endl;
}
在代碼中,咱們在類 A 中聲明瞭函數 fri_fun ,並以 friend 關鍵字加以說明,此時咱們能夠在函數 fri_fun 中訪問 A 類的私有成員。
友元的聲明僅僅指定了訪問的權限,而非一個一般意義上的函數聲明。若是咱們但願類的用戶能過調用某個友元函數,那麼咱們就必須在友元聲明以外再專門對函數進行聲明。
一些編譯器容許在尚無友元函數的初始聲明的狀況下就調用它。即便這樣,也最好仍是提供一個獨立的函數聲明。
2、友元類
友元類也須要 friend 關鍵字加以說明。
例如:編譯器
class B{
friend class A;
int s=9;
};
class A {
public:
void aa(B c) {
cout << c.s << endl;
}
};
類 A 的成員函數能夠訪問類 B 的私有成員。
注意:若是咱們把類 A 放在類 B 的前邊,此時編譯會出錯,由於在編譯類 A 時,咱們並無定義類 B。
咱們也能夠將成員函數做爲另外一個類的友元,咱們將上一個代碼更改,僅僅讓類 A 的成員函數 aa 能夠訪問類 B 的私有成員:編譯
class B;
class A{
public:
void aa(B c);
};
class B{
friend void A::aa(B);
int s=9;
};
void A::aa(B c){
std::cout << c.ss << std::endl;
}
咱們將類 A 的成員函數 aa 做爲類 B 的友元函數,這是咱們必須在類 B 以前聲明函數 aa (咱們的代碼,在類 A 中已經聲明),在類 B 以後定義(若是用到類 B 的成員),在友元聲明中咱們必須指明該函數屬於哪個類。
在類 A 中,成員函數 aa 的形參包含 B 類類型元素,因此在類 A 以前,必須有類 B 的前向聲明。
class