下面是一个计算两点之间距离的方法。
#include <iostream > #include <math.h> class Point { private: int x; int y; public: Point(int x, int y) { this->x = x; this->y = y; } int getX() { return x; } int getY() { return y; } }; //计算两点之间距离 double distance(Point& p1, Point& p2) { int X = p1.getX() - p2.getX();//频繁使用getX() int Y = p1.getY() - p2.getY();//频繁使用getY() return sqrt(X*X+Y*Y); } using namespace std; int main() { Point p1(1, 1), p2(2, 2); cout << distance(p1, p2); }
可以发现,频繁的调用getX()、getY(),导致频繁的压栈出栈,浪费时间空间。
所以引出友元函数。
友元函数就是为了解决,方便某一个函数频繁使用类中变量。
改写上面例子:
class Point { private: int x; int y; public: Point(int x, int y) { this->x = x; this->y = y; } int getX() { return x; } int getY() { return y; } friend double distance(Point& p1, Point& p2);//友元函数 }; //计算两点之间距离 double distance(Point& p1, Point& p2) { int X = p1.x - p2.x;//改写 int Y = p1.y - p2.y;//改写 return sqrt(X*X+Y*Y); } using namespace std; int main() { Point p1(1, 1), p2(2, 2); cout << distance(p1, p2); }
通过增加函数一个声明,就可以在这个声明的函数内部,访问私有成员变量。
friend double distance(Point& p1, Point& p2);
友元函数破坏了类的封装,一般不建议使用。