友元(Friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元在一些特殊情况下非常有用,但也应谨慎使用,因为它会打破封装性和数据隐藏原则。
当一个类或函数被声明为另一个类的友元时,它就能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。友元的作用类似于家庭中的密友,可以借助其特殊身份获得其他成员私有信息的访问权。然而,友元并不是简单的双向关系,即A类是B类的友元,B类也是A类的友元,这种关系并不成立。友元有三种:友元函数、友元类、友元成员函数。
- class ClassA
- {
- public:
- ClassA() { private_data = 5; };
- private:
- int private_data;
- friend void FriendFunction(ClassA& class_a);
- };
-
- void FriendFunction(ClassA& class_a)
- {
- printf("%d\n", class_a.private_data);
- }
-
- int main(int argc, char* argv[])
- {
- ClassA class_a;
- FriendFunction(class_a);
- }
FriendFunction是ClassA的友元函数,因此FriendFunction可以直接访问ClassA的私有成员。
- class ClassB;
- class ClassA
- {
- public:
- ClassA() { private_data = 5; };
- private:
- int private_data;
- friend class ClassB;
- };
-
- class ClassB
- {
- public:
- void GetClassAPrivate(ClassA& class_a)
- {
- printf("%d\n", class_a.private_data);
- };
- };
- int main(int argc, char* argv[])
- {
- ClassA class_a;
- ClassB class_b;
- class_b.GetClassAPrivate(class_a);
- }
主要语法:friend class FriendClass;
ClassB是ClassA的友元类,因此ClassB可以直接访问ClassA的私有成员
- class ClassA;
- class ClassB
- {
- public:
- void GetClassAPrivate(ClassA& class_a);
- };
-
- class ClassA
- {
- public:
- ClassA() { private_data = 5; };
- friend void ClassB::GetClassAPrivate(ClassA& class_a);
-
- private:
- int private_data;
- };
-
- void ClassB::GetClassAPrivate(ClassA& class_a)
- {
- printf("%d\n", class_a.private_data);
- };
-
- int main(int argc, char* argv[])
- {
- ClassA class_a;
- ClassB class_b;
- class_b.GetClassAPrivate(class_a);
- }
注意:友元成员函数,应该这么理解ClassB的成员函数是ClassA的友元成员函数,意思是成员函数是ClassB不是ClassA的不要弄混了。由于需要把ClassB的某个成员函数定义为ClassA的友元成员函数,因此ClassB的类定义要放在ClassA之前,不然的话ClassA不知道ClassB有哪些成员函数。
注:友元不能 继承,交换,传递!