友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。
友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。不过,类的访问权限确实在某些应用场合显得有些呆板,从而容忍了友元这一特别语法现象。
#include <iostream>
#include <math.h>
using namespace std;
class Data //Data类声明
{
public: //外部接口
Data(int xx=0) { x=xx; }
int GetX() { return x; }
friend int Add(Data &a, Data &b);
private: //私有数据成员
int x;
};
int Add(Data &a, Data &b)
{
return a.x + b.x;
}
int main()
{
Data a(1);
Data b(2);
int sum = Add(a, b);
cout<<"The sum is "<<sum<<endl;
return 0;
}
友元类:
友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数,且可以访问其私有成员和保护成员。
注意:友元关系不能传递,如果类B是类A的友元,类C又是类B的友元,类C和类A如果没有声明则没有友元关系,另外,友元关系是单向的,如果类B是类A的友元,类B的成员函数可以访问类A对象的私有成员和保护成员,但是类A的成员函数不能访问类B对象的私有成员和保护成员。