友元
1. 什么是友元
- 允许一个类将其非公有成员的访问权授予给指定的函数或类
- 友元的声明只能出现在类定义的内部,通常放在类的开始或结尾
- 友元不受访问控制的影响
说明:
- 访问类非公有成员可以有两个用户:类成员和友元
2. 友元函数
-
友元函数:在一个类以外定义了函数并该类内部用friend声明了定义的函数,此函数就是这个类的友元函数,该函数可访问这个类的私有成员
#include <iostream> #include <cmath> using namespace std; class Point{ public: Point(int _x=0, int _y=0) : x(_x), y(_y) { }; private: int x, y; friend double distance(Point & r1, Point& r2); // 友元函数 }; double distance(Point& r1, Point & r2) { double x = r2.x > r1.x ? r2.x - r1.x : r1.x - r2.x; // 访问Point类的私有成员 double y = r2.y > r1.y ? r2.y - r1.y : r1.y - r2.y; // 访问Point类的私有成员 return sqrt(x*x + y*y); } int main() { Point a(1, 1), b(5, 5); cout << distance(a,b); return 0; }
-
友元成员函数:友元函数可以是另一个类的成员函数
3. 友元类
-
可以把一个类(如类B)声明为另一个类(如类A)的友元,,这时类B就是类A的友元类,此时类B的所有成员函数可以访问类A的非公有数据成员
class A{ ... friend B; }; class B{ ... };
-
友元的关系不是双向的:在类A中声明了类B是类A的友元类不等于类A是类B的友元类
-
友元的关系不能传递或继承:C是B的友元类,B是A的友元类,不等于C是A的友元类