一.来源
下面是一个计算两点之间距离的方法。
#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);
三.问题
友元函数破坏了类的封装,一般不建议使用。