1.關鍵字friend只出現在類定義的內部(這點與const不同)
2.友元是授予友元關係的那個類的成員
3.定義類B為類A的友元,B可以訪問A的私人成員
例1:/*要注意友元的使用順序,聲明B->定義A->定義B*/ class B;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/ class A { private: int x; public: A(int i):x(i){} friend B;/*將B聲明為友元,B可以訪問A的private*/ }; class B { private: int x; public: void Test(A a) { x = a.x; } int Get(){return x;} }; int main() { A a(3); B b; b.Test(a); //輸出3.說明Test()函數賦值成功,也說明Test()中的x是B的成員,從而得知,Test()是屬於B的 cout<<b.Get()<<endl; return 0; }
4.定義類B的Test()函數為類A的友元,B的Test()函數可以訪問A的私人成員
例2:/*要注意友元的使用順序,聲明A->定義B(要作為友元的那個函數只聲明不定義)->定義A->定義B的函數*/class A;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/class B{private:int x;public:void Test(A a);int Get(){return x;}};class A{private:int x;public:A(int i):x(i){}friend void B::Test(A a);/*將B的Test()聲明為友元,B的Test()可以訪問A的private*/};void B::Test(A a){x = a.x;}int main(){A a(3);B b;b.Test(a);//輸出3.說明Test()函數賦值成功,也說明Test()中的x是B的成員,從而得知,Test()是屬於B的cout<<b.Get()<<endl;return 0;}
5.友元聲明將已命名的類或非成員函數引入到外圍範圍中。此外,友元函數可以在類的內部定義,該函數的範圍擴充到包圍該類定義的範圍。
例3:
/*本來A和f()的範圍只限於在它們聲明之後。但是因為類B提前引入了它們,使得它們的範圍與類B的範圍相同*/class B{friend class A;friend void f();};class C{public:A *p;void g(){return f();}};class A;void f(){cout<<"1"<<endl;}int main(){C c;c.g();//輸入1return 0;}
6.友元函數的重載函數,如果要成為友元,必須要用friend聲明。
例4:
class A;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/class B{private:int x;public:void Test(A a);void Test(A a1, A a2);void Test(A a1, A a2, A a3);int Get(){return x;}};class A{private:int x;public:A(int i):x(i){}friend void B::Test(A a);/*將B的Test()聲明為友元,B的Test()可以訪問A的private*/friend void B::Test(A a1, A a2);};//正確,因為已經被定義為友元void B::Test(A a){x = a.x;}//正確,因為已經被定義為友元void B::Test(A a1, A a2){x = a1.x + a2.x;}//錯誤,不能因為Test(A a)是友元,就認為它的重載也是友元void B::Test(A a1, A a2, A a3){x = a1.x + a2.x + a3.x;}