類別成員函式,並為 Friends 的類別
類別成員函式可以宣告為其他類別中的朋友。 參考下列範例:
// 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& )被授與 friend 存取類別B。 因此可存取私用成員_b是在正確的Func1 類別的A ,但是Func2。
A friend類別是所有的成員函式都是類別的 friend 函式類別,也就是其成員函式能夠存取另一個類別的私用和受保護的成員。 假設friend類別中的宣告B假設是:
friend class A;
在此情況中,在類別中的所有成員函式A會被授與 friend 存取類別B。 下列程式碼是 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。
Managed 型別不能有任何的 friend 函式、 friend 類別或朋友的介面。
友誼不會繼承,這表示類別衍生自YourOtherClass無法存取YourClass的私用成員。 友誼不是可轉移的因此類別,為朋友的YourOtherClass無法存取YourClass的私用成員。
下圖顯示四個類別宣告: Base, Derived, aFriend,以及anotherFriend。 只有類別aFriend的私用成員的直接存取Base (和其任何成員Base接手)。
朋友的關聯性的含意