在C++中,在某些情況下,允許特定的非成員函數訪問一個類的私有成員,同時仍然阻止一般的訪問,這是很方便做到的。例如,被重載的操作符,如輸入或輸出操作符,經常需要訪問類的私有數據成員。這些操作符不可能為類的成員。然而,盡管不是類的成員,它們仍是類的“接口的組成部分”。 而友元機制,允許一個類將對其非公有成員的訪問權授予指定的函數或類。友元的聲明以關鍵字 friend 開始。它只能出現在類定義的內部。友元聲明可以出現在類中的任何地方:友元不是授予友元關系的那個類的成員,所以它們不受聲明出現部分的訪問控制影響。 下面給出C++中所有有關友元的結論和限制,然後後面針對每個細節給出示例: 1,友元關系總共有三種: 1.1,將一個非成員函數 reset( ) 聲明為類 example 的友元函數,使得該非成員函數可以訪問類 example 的私有成員。 [cpp] 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的私有成員。 [cpp] 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,將一個類Y的某成員函數聲明為類X的友元函數,使得可以通過類Y的這個成員函數訪問類X的私有成員。 [cpp] 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(); } */ 2,