共用方式為


類別成員函式和類別做為 Friend

類別成員函式可以宣告為其他類別的 friend。 參考下列範例:

// classes_as_friends1.cpp
// compile with: /c
class B;

class A {
public:
   int Func1( B& b );

private:
   int Func2( B& b );
};

class B {
private:
   int _b;

   // A::Func1 is a friend function to class B
   // so A::Func1 has access to all members of B
   friend int A::Func1( B& );
};

int A::Func1( B& b ) { return b._b; }   // OK
int A::Func2( B& b ) { return b._b; }   // C2248

上述範例只授與 A::Func1( B& ) 函式類別 B 的 friend 存取權限。 因此,在 A 類別的 Func1 中存取私用成員 _b 是正確的,而在 Func2 中則不正確。

friend 類別是其所有成員函式皆為某個類別之 friend 函式的類別,也就是說,其成員函式可以存取其他類別的 private 成員和 protected 成員。 假設 B 類別中的 friend 宣告如下:

friend class A;

在這種情況下,A 類別中的所有成員函式將獲得類別 B 的 friend 存取權限。 下列程式碼是 friend 類別的範例:

// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class YourClass {
friend class YourOtherClass;  // Declare a friend class
public:
   YourClass() : topSecret(0){}
   void printMember() { cout << topSecret << endl; }
private:
   int topSecret;
};

class YourOtherClass {
public:
   void change( YourClass& yc, int x ){yc.topSecret = x;}
};

int main() {
   YourClass yc1;
   YourOtherClass yoc1;
   yc1.printMember();
   yoc1.change( yc1, 5 );
   yc1.printMember();
}

除非明確指定,否則夥伴關係不是雙向的。 在上述範例中,YourClass 的成員函式無法存取 YourOtherClass 的 private 成員。

Managed 型別不能包含任何 friend 函式、friend 類別或 friend 介面。

夥伴關係不能繼承,也就是說,衍生自 YourOtherClass 的類別不能存取 YourClass 的 private 成員。 夥伴關係不可轉移,因此,若類別屬於 YourOtherClass 的 friend,就無法存取 YourClass 的 private 成員。

下圖說明四種類別宣告:Base、Derived、aFriend 和 anotherFriend。 只有類別 aFriend 可以直接存取 Base 的 private 成員 (以及 Base 可能繼承的任何成員)。

隱含的 friend 關聯性

friend 關聯性的含意

請參閱

參考

friend (C++)