在类中有一种函数声明前加friend关键字的函数声明方式,这种函数被称为C++类的友元函数
1. 友元的作用——破坏封装性
友元函数就像朋友一样,可以自由调用该类的私有成员函数和类的私有数据成员。其一定程度上破坏了类的封装性,建议尽量减少使用友元,但其好处是在某些情况下可以简化代码,优化效率。
class complex{
private:
friend complex& operator+=(complex & l, const complex & r);
};
complex& operator+=(complex& l, const complex & r){
l.re += r.re; //声明友元后可以自由使用complex类的私有数据成员
l.im += r.im; //既简化了代码又可以提高效率
return l;
}
如果不使用友元运算符+=重载可能要写成如下样子:
complex operator+=( complex& l, const complex & r ){
double re = l.real() + r.real(); //调用函数,增加压栈操作和开销
double im = l.imag() + r.imag();
return complex(re,im); // 增加临时变量的开销,并且返回只能做值传递,增加一次赋值操作
}
2. 相同class的各个object互为友元
这一重要性质可以用如下代码展示:
class complex{
……
public:
//普通的类中成员函数
int function(const complex& param){
return param.re + param.im;
}
};
对其调用如下
{
complex c1(2,1);
complex c2; //由于class的各个object互为友元,所以c2可以通过function函数直接使用c1的私有数据成员
cout << c2.function(c1) << endl;
}