在将一个类中的成员函数作为另一个类的友元函数的案例中我们看到,为了一个其他类的函数可以访问本类中的私有成员,将 distance 函数声明成了 friend 函数。其实我们也完全可以将整个 ManagerPoint 类声明为 Point 类的友元类。代码如下:
#include<iostream> using namespace std; class Point; class ManagerPoint { public: int distance(Point& a, Point& b); }; class Point { public: Point(int xx, int yy) { _x = xx; _y = yy; } void display() { cout << "(" << _x << "," << _y << ")" << endl; } // 将整个 ManagerPoint 类声明为 Point 的友元类 friend class ManagerPoint; private: int _x; int _y; }; int ManagerPoint::distance(Point& a, Point& b) { int dx = a._x - b._x; int dy = a._y - b._y; return sqrt(dx * dx + dy * dy); } int main(int argc, char* argv[]) { Point p1(3, 4), p2(6, 8); p1.display(); p2.display(); ManagerPoint mp; int d = mp.distance(p1,p2); cout << "Distance is : " << d << endl; getchar(); return 0; }
这样,ManagerPoint 类中的所有成员函数都可以访问 Point 类中的私有成员了。通过几篇文章的记载,我们一共见到了三种友元的方式。一种是全局友元函数、一种是某类的成员函数做友元函数,最后一种则是将整个类作为某类的友元类。
class A { public: // 全局友元函数 friend void func(A &a); // 类成员函数做友元函数 friend void B::func(A &a); // 完整的类做友元类 friend class B; };