选件类成员函数和选件类为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& ) 类别 B的友元访问权限。 因此,为私有成员 _b 的访问是正确的。类 AFunc1,但不在 Func2。

friend 是类,也就是说,函数是成员类的友元函数成员函数访问其他类的私有的和受保护的成员中。 假定在类 B 的 friend 声明为:

friend class A;

在此情况下,将授予类 A 的所有成员函数类别 B的友元访问权限。 下面的代码是 friends 类的示例:

// 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的私有成员。

托管类型不能有任何友元函数、友元类或 friend 接口。

友元关系不继承,这意味着 YourOtherClass 从派生的类不能访问 entity_YourClass 的私有成员。 友元关系不是传递的,因此是 YourOtherClass friend 无法访问 entity_YourClass 的私有成员的类。

下图显示了四个类声明: Base、 Derived、 aFriend和 anotherFriend。 仅类 aFriend 具有直接访问 Base 的私有成员 (和所有成员 Base 可能已继承的)。

友元关系的含义

友元关系含义图

请参见

参考

friends (C++)