我们都知道类中的私有成员,只有被类里的成员函数访问,在类外是不能访问的。这体现了C++中类设计的封装、隐蔽思想,是C++最基本的优点。
但如果偶尔有的时候,我们在类外又确实想访问这些私有成员,就会变得麻烦很多,就处于既访问不到又不能声明为public类型的两难处境。
而友元的出现就可以很好的解决这个问题,即把外部的函数声明为友元类型,赋予它可以访问类内私有成员的权利,来做到两全其美。这就是友元的意义,从字面意思也可以看出来,像“朋友”一样,开了一个绿色通道。
友元的对象,它可以是全局的一般函数,也可以是其他类里的成员函数,这种叫做友元函数。不仅如此,友元还可以是一个类,这种叫做友元类。
理解友元的意义和作用后,我们来看怎么在C++中使用。对于友元函数,只需要在类内对这个函数进行声明,并在之前加上friend关键字。这个函数就具有了独特的权限,成为友元函数。
#include<iostream>
#include<math.h>
using namespace std;
class Point
{
private:
double x;
double y;
public:
Point(double a,double b)
{
x = a;
y = b;
}
int GetPoint()
{
cout<<"("<<x<<","<<y<<")";
return 0;
}
friend double Distance(Point &a,Point &b);
};
//求两点之间的距离
double Distance(Point &a,Point &b)
{
double xx;
double yy;
xx = a.x-b.x;
yy = a.y-b.y;
return sqrt(xx*xx+yy*yy);
}
int main()
{
Point A(2.0,3.0);
Point B(1.0,2.0);
double dis;
dis = Distance(A,B);
cout<<dis<<endl;
return 0;
}
其中:这样实现友元函数时错误的,友元函数不属于这个类的本身,不能使用类内的this指针,同时也不能被继承。
//求两点之间的距离
double Point :: Distance(Point &a,Point &b)
{
double xx;
double yy;
xx = a.x-b.x;
yy = a.y-b.y;
return sqrt(xx*xx+yy*yy);
}