1.友元函數的一般形式:
friend <返回類型> <函數名>(<參數列表>);
#include <iostream> using namespace std; class Test { friend class Object; //友元類 friend void g_func(); //友元函數 Test() { a = 10; } private: int a; void func() { cout << "this is Test private func a = " << a << endl; } }; class Object //友元類 { public: void ObjFunc() { Test t; t.a = 30; t.func(); } }; void g_func() //友元函數 { Test t; t.a = 99; t.func(); } int main(int argc, char** argv) { Object cc; cc.ObjFunc(); g_func(); system("pause"); return 0; }
2.注意點:
- 類中通過使用關鍵字friend 來修飾友元函數,但該函數並不是任何類的成員函數,其聲明可以放在類的私有部分,也可放在共有部分。友元函數的定義在類體外實現,不需要加類限定。
class Test { Test() { a = 10; } private: friend class Object; friend void g_func(); int a; void func() { cout << "this is Test private func a = " << a << endl; } };
2. 一個類中的成員函數可以是另外一個類的友元函數,而且一個函數可以是多個類友元函數。
#include <iostream> using namespace std; class Test; class ObjTest { public: ObjTest(){} public: void Func2(Test & tt); //在聲明為Test友元函數之前,必須只是聲明,不能定義,否則編譯不過,個人理解原因:編譯之前尚未確定是Test的友元函數,導致無法訪問private成員; }; class Test { public: friend void ObjTest::Func2(Test & tt); //一個類的成員函數,作為另外一個類的友元函數; Test() { a = 10; } private: int a; void func() { cout << "this is Test private func a = " << a << endl; } }; void ObjTest::Func2(Test & tt) //聲明為Test之后在定義; { tt.a = 340; tt.func(); } int main(int argc, char** argv) { ObjTest jj; Test tt; jj.Func2(tt); system("pause"); return 0; }
- 友元函數可以訪問類中的私有成員和其他數據,但是訪問不可直接使用數據成員,需要通過對對象進行引用。
- 友元函數在調用上同一般函數一樣,不必通過對對象進行引用。
- 可以把類聲明為友元,但是“朋友”只能是單向的,被聲明為朋友的類csthing,可以不受protected,protected的限制訪問CObject各成員;