友元(friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元关系不是继承关系,它是一种非对称的关系,即如果类A是类B的友元,那么类B不一定是类A的友元。
友元的主要作用是在某些情况下,需要访问类的私有成员,但不希望通过公有接口来实现。友元可以提供更为直接的访问权限,但同时也破坏了封装性,因此需要谨慎使用。
友元的用法:
-
友元函数: 一个函数可以被声明为一个类的友元,使得该函数能够访问该类的私有成员。
class MyClass { private: int privateMember; public: MyClass() : privateMember(0) {} // 声明友元函数 friend void friendFunction(MyClass& obj); // 其他成员函数 }; // 友元函数的定义 void friendFunction(MyClass& obj) { // 可以访问 MyClass 的私有成员 obj.privateMember = 42; }
-
友元类: 一个类可以成为另一个类的友元,使得这个类能够访问另一个类的私有成员。
class FriendClass { public: void accessPrivateMember(MyClass& obj) { // 可以访问 MyClass 的私有成员 obj.privateMember = 42; } }; class MyClass { private: int privateMember; public: MyClass() : privateMember(0) {} // 声明友元类 friend class FriendClass; // 其他成员函数 };
-
友元成员函数: 类的成员函数可以是另一个类的友元,同样允许访问另一个类的私有成员。
class FriendClass; class MyClass { private: int privateMember; public: MyClass() : privateMember(0) {} // 友元成员函数的声明 void friendMemberFunction(FriendClass& obj); // 其他成员函数 }; class FriendClass { public: // 友元成员函数的定义 void MyClass::friendMemberFunction(FriendClass& obj) { // 可以访问 FriendClass 的私有成员 obj.privateMember = 42; } };
需要注意的是,友元关系是单向的,不具有传递性。如果类A是类B的友元,类B不一定是类A的友元。友元关系的设置应该谨慎,尽量减小程序的耦合度。