假设有这么一个类
1 class aa 2 { 3 private: 4 int num; 5 string name; 6 public: 7 aa(int a, int b); 8 }
这时候如果外界的一个函数(void display() )想去访问aa这个类的name这个成员变量,这个函数可能不属于任何一个类,也可能是其他类的 。 显然是不可能的,因为他是类的私有成员,只有该类的成员函数才能访问
但这时候又一定要访问这个变量,这时候就可以把这个函数声明为这个类的友元函数,具体如下
1 class aa 2 { 3 private: 4 int num; 5 string name; 6 public: 7 aa(int a, int b); 8 friend void display();//声明为友元函数 9 }
这时候display这个函数就能访问aa这个类的私有成员了,更不用说公有成员
上面说的比较清楚了,下面做一下总结:
1 友元函数是允许一个类将其非公有成员的访问权授予这个函数
2 友元关系的声明只能出现在类的任意地方,但是友元函数不是类的成员函数,不受访问控制符的影响,所以一般将友元的声明放在类的开头或者是结尾。
3 友元可以是普通的函数, 或已定义的其他类的成员函数, 或整个类。
将一个函数设为友元, 称为友元函数( friend function) , 将一个
类设为友元, 称为友元类( friend class) 。 友元类的所有成员函数都可以访问授予友元关系的那个类的非公有成员。
因此, 访问类非公有成员可以有两个用户: 类成员和友元
4 友元的关系是单向的而不是双向的。 如果声明了类B是类A的
友元类, 不等于类A是类B的友元类, 类A中的成员函数不能访问类
B中的私有数据。
5 友元的关系不能传递或继承, 如果类B是类A的友元类, 类C
是类B的友元类, 不等于类C是类A的友元类。 如果想让类C是类A的
友元类, 必须显式地在类A中另外声明。
最重要的一点:
一般不要用友元函数