在C++中,为什么要引入友元的概念呢?主要是为了实现数据共享,提高程序效率,方式就是避免过多的函数调用。请看以下实例:
#include<iostream.h>
#include<math.h>
class Point
{
public:
Point(int xx,int yy)
{
X=xx;
Y=yy;
}
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
friend float fDist(Point &a,Point &b);//友元函数声明
private:
int X,Y;
};
float fDist(Point &p1,Point &p2)
{
double x = double(p1.X - p2.X);//外部函数可以访问类的私有成员
double y = double(p1.Y - p2.Y);
return float(sqrt(x*x+y*y));
}
void main()
{
Point myp1(1,1),myp2(4,5);
cout<<"The distance is:";
cout<<fDist(myp1,myp2)<<endl;
}
从上面代码可以看出,加入我们不使用友元函数,那么该函数就不能使用类里面的私有成员,这样就要调用大量的函数来获取该私有成员,如要获取p1,X,我们要调用GetX(),造成开销。但是如果私有成员结构如果发生变化,友元函数就要随着改变,如果程序比较大型,那改动也比较大,所以使用起来需要权衡好。
以上是友元函数的情况,当然友元函数也可以在其他类中实现。下面介绍友元类。如在B类中声明A类为他的友元类,那么在B类的成员函数都可以访问A类中的所有私有和保护成员。如下列代码:
#include<iostream.h>
class A
{
friend class B;//声明B是A的友元,B中可以使用A中所有属性
public:
void Display()
{
cout<<x<<endl;
}
int Getx()
{
return x;
}
private:
int x;
};
class B
{
public:
void Set(int i);
void Display();
private:
A a;
};
void B::Set(int i)
{
a.x=i;//可以访问A中的私有成员
}
最后2点需要注意的:
一:友元关系是不能传递的。如B是A的友元类,C是B类的友元类,不能说明A和C有任何关系。
二:友元关系是单向的, B是A的友元类不能说明A也是B的友元类。