在類中有一種函數(shù)聲明前加friend關(guān)鍵字的函數(shù)聲明方式免都,這種函數(shù)被稱為C++類的友元函數(shù)
1. 友元的作用——破壞封裝性
友元函數(shù)就像朋友一樣锉罐,可以自由調(diào)用該類的私有成員函數(shù)和類的私有數(shù)據(jù)成員。其一定程度上破壞了類的封裝性绕娘,建議盡量減少使用友元脓规,但其好處是在某些情況下可以簡化代碼,優(yōu)化效率业舍。
class complex{
private:
friend complex& operator+=(complex & l, const complex & r);
};
complex& operator+=(complex& l, const complex & r){
l.re += r.re; //聲明友元后可以自由使用complex類的私有數(shù)據(jù)成員
l.im += r.im; //既簡化了代碼又可以提高效率
return l;
}
如果不使用友元運(yùn)算符+=重載可能要寫成如下樣子:
complex operator+=( complex& l, const complex & r ){
double re = l.real() + r.real(); //調(diào)用函數(shù)抖拦,增加壓棧操作和開銷
double im = l.imag() + r.imag();
return complex(re,im); // 增加臨時變量的開銷,并且返回只能做值傳遞舷暮,增加一次賦值操作
}
2. 相同class的各個object互為友元
這一重要性質(zhì)可以用如下代碼展示:
class complex{
……
public:
//普通的類中成員函數(shù)
int function(const complex& param){
return param.re + param.im;
}
};
對其調(diào)用如下
{
complex c1(2,1);
complex c2; //由于class的各個object互為友元态罪,所以c2可以通過function函數(shù)直接使用c1的私有數(shù)據(jù)成員
cout << c2.function(c1) << endl;
}