在C++中,在某些情況下,允許特定的非成員函數訪問一個類的私有成員,同時仍然阻止一般的訪問,這是很方便做到的。例如,被重載的操作符,如輸入或輸出操作符,經常需要訪問類的私有數據成員。這些操作符不可能為類的成員。然而,盡管不是類的成員,它們仍是類的“接口的組成部分”。
而友元機制,允許一個類將對其非公有成員的訪問權授予指定的函數或類。友元的聲明以關鍵字 friend 開始。它只能出現在類定義的內部。友元聲明可以出現在類中的任何地方:友元不是授予友元關系的那個類的成員,所以它們不受聲明出現部分的訪問控制影響。
--------------------------------------分割線 --------------------------------------
相關閱讀 :
C++中友元的一些總結 http://www.linuxidc.com/Linux/2009-12/23601.htm
友元函數的簡單使用(C++實現) http://www.linuxidc.com/Linux/2011-10/45842.htm
C++學習之友元函數 http://www.linuxidc.com/Linux/2012-02/54679.htm
C++中使用類(重載,友元函數,轉換函數等) http://www.linuxidc.com/Linux/2012-08/68144.htm
關於C++友元的一些思考 http://www.linuxidc.com/Linux/2012-08/69121.htm
C++友元函數獲取成員變量(作為調試後門程序) http://www.linuxidc.com/Linux/2013-04/83220.htm
C++運算符重載函數作為類成員函數和友元函數 http://www.linuxidc.com/Linux/2013-09/90667.htm
--------------------------------------分割線 --------------------------------------
下面給出C++中所有有關友元的結論和限制,然後後面針對每個細節給出示例:
1,友元關系:
1.1,將一個非成員函數 reset( ) 聲明為類 example 的友元函數,使得該非成員函數可以訪問類 example 的私有成員。
class example; // 這裡必須對類 example 做前向聲明,否則下面的函數聲明將報錯
void reset(example &e);
class example
{
public:
friend void reset(class example &e);
private:
int n;
};
// 該函數定義必須放在類 example 的後面,否則無法解析變量n
void reset(example &e)
{
e.n = 0;
}
1.2,將類man聲明為類woman的友元類,使得可以通過類man對象訪問類woman的私有成員。
class woman; // 前向聲明
class man
{
public:
void disp(woman &w);
void reset(woman &w);
};
class woman
{
public:
friend class man; // 將man設為woman的友元類,這樣man對象的任何成員函數都可以訪問woman的私有成員
private:
string name;
};
void man::disp(woman &w)
{
cout << w.name << endl;
}
void man::reset(woman &w)
{
w.name.clear();
}
1.3,將一個類man的成員函數disp()聲明為類woman的友元函數,使得可以通過disp成員函數訪問類woman的私有成員。
class woman; // 前向聲明
class man
{
public:
void disp(woman &w);
void reset(woman &w);
};
class woman
{
public:
friend void man::disp(woman &w); // 將man的其中一個成員函數disp()設為woman的友元函數,就可以使用該函數訪問woman對象的私有成員了
private:
string name;
};
void man::disp(woman &w)
{
cout << w.name << endl;
}
// man的reset()成員函數不是woman類的友元函數,因此不能訪問其私有成員
/*
void man::reset(woman &w)
{
w.name.clear();
}
*/
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-05/101241p2.htm