[C++]【類】友元的三種聲明及注意事項

類容許其餘類或者函數訪問它的非公有成員,但咱們須要將訪問類非公有成員的其餘類或者函數成爲它的友元。
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

相關文章
相關標籤/搜索