1、友元函数的作用:让不是类的成员函数可以访问该类的私有成员,提高效率。
2、关于友元的几点总结:
2.1 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
2.2 友元函数是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明。
2.3 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
2.4 友元不是类的成员,只是一个申明,写在类的任意一个位置都可以。
2.5 友元关系不能被继承,不具有传递性。友元关系是单向的,不具有交换性。
2.6 类似 goto 语句,不建议经常使用。
2.7 声明一个 其他类 的成员函数为自己的友元,不建议使用。
3、参考代码:
class Point;//申明一个类
class PointManager
{
public:
//如果解决循环前置声明的问题,应该将函数的声明和函数的定义分开写。
double PointDistance(Point & p1, Point &p2);
};
class Point
{
public:
Point(int x, int y)
{
this->x = x;
this->y = y;
}
void printPoint()
{
cout << "x = " << x << ", y = " << y << endl;
}
int getX()
{
return this->x;
}
int getY()
{
return this->y;
}
//声明一个全局函数为自己的友元,这里只是申明,写在类中任意一个位置都行。
friend double PointDistance(Point & p1, Point &p2);
//声明一个 其他类的成员函数为自己的友元 不建议使用
friend double PointManager::PointDistance(Point & p1, Point &p2);
private:
int x;
int y;
};
double PointManager::PointDistance(Point & p1, Point &p2)
{
//int dd_x = p1.getX() - p2.getX();
int dd_x = p1.x - p2.x;
//int dd_y = p1.getY() - p2.getY();
int dd_y = p1.y - p2.y;
return sqrt(dd_x*dd_x + dd_y*dd_y);
}
double PointDistance(Point & p1, Point &p2)
{
//int dd_x = p1.getX() - p2.getX();
int dd_x = p1.x - p2.x;
//int dd_y = p1.getY() - p2.getY();
int dd_y = p1.y - p2.y;
return sqrt(dd_x*dd_x + dd_y*dd_y);
}