1. 程式人生 > >[C++]【類】友元的三種宣告及注意事項

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

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 類的私有成員。
  友元的宣告僅僅指定了訪問的許可權,而非一個通常意義上的函式宣告。如果我們希望類的使用者能過呼叫某個友元函式,那麼我們就必須在友元宣告之外再專門對函式進行宣告。
  一些編譯器允許在尚無友元函式的初始宣告的情況下就呼叫它。即使這樣,也最好還是提供一個獨立的函式宣告。
二、友元類
  友元類也需要 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 的前