1. 使用友元的原因:
類具有封裝和信息隱藏的作用,只有類的成員函數才能訪問類的私有成員。如果把數據成員都定義爲公有的,會破壞類的隱藏特性。但爲了訪問這些數據成員經常需要多次調用成員函數,會有很多開銷。因此才使用友元。
2. 友元的種類
友元可以是一個函數(友元函數),也可以是一個類(友元類)。
友元函數定義在類的外部,它不是類的成員函數,但需要再類體內用關鍵字friend進行聲明。友元函數不是類的成員函數,但它可以訪問類的私有成員。提高了程序的運行效率,但是破壞了類的封裝性和隱藏性。
3. 書寫習慣
儘管友元關係可以寫在類定義中的任何地方,但是較好的編程習慣是:將所有友元關係的聲明放在最前面的位置,並且不加任何訪問控制符。
附:面試例題
請描述模板類的友元重載。(《程序員面試寶典》第121頁,不太理解題目意思,求解)
#include <iostream>
using namespace std;
//類Test的聲明
template <class T>
class Test;
//重載<<的聲明
template <class T>
ostream& operator<< (ostream& out,const Test<T> &obj);
template <class T>
class Test
{
friend ostream& operator<< (ostream& out,const Test<T> &obj);
private:
int num;
public:
Test(int n=0){num=n;}
Test(const Test<T>& t){num=t.num;}
};
template<class T>
ostream& operator<< (ostream& out,const Test<T> &obj)
{
out<<obj.num;
return out;
}
int _tmain(int argc, _TCHAR* argv[])
{
Test<int> t(1);
cout<<t<<endl;
return 0;
}