//对于友元需要考虑的有三个点:成员函数友元,类友元,非成员函数友元 #include <iostream> using namespace std; /*对于类友元:如果一个类B要让A类成为其友元的话,首先那个B类要定义,定义完成之后才定义友元类 理解就是:对于A中的函数需要操作这个B类,所以B类之前要定义*/ // class B // { // int bi; // public: // B(int i):bi(i){} // friend class A; // }; // class A // { // public: // A(){} // void A::afun(B& b) // { // cout<<"B中元素使用i"<<b.bi<<endl; // } // // }; // // // int main() // { // B b(3); // A a; // a.afun(b); // return 0; // } /*对于类成员函数成为友元:A类中的成员函数成为B类的友元,那么: */ // class B; // class A // { // public: // A(){} // void A::afun(B& b) // // { // // cout<<"B中元素使用i"<<b.bi<<endl; // // } // // }; // class B // { // int bi; // public: // B(int i):bi(i){} // friend void A::afun(B& b); // }; // // void A::afun(B& b) // // { // // cout<<"B中元素使用i"<<b.bi<<endl; // // } // // // int main() // { // B b(3); // A a; // a.afun(b); // return 0; // } // // 对于那些在类的成员函数作为类的一个友元的话,此处是A类的一个成员函数要做B的友元,那么这里的话就是对于A类的成员函数 // // 如果要调用B类的成员的时候必须在B类定义完成之后再定义,A类要在B类定义前定义,但是该成员函数要在定义之后定义, // 也就是说A类要在A类的成员函数成为的友元的那个类前调用,友元的那个函数要在成为友元的那个累定义完全之后在定义,也就是A类的成员函数 // 要成为B类的友元,A类要调用B类的话,前面要声明下B类,A类的定义要在B类前面,B类定义完全之后才是A的成员函数定义 /*下面是对于非成员函数成为友元*/ class A { int i; public: A(int j):i(j){} friend void fun(A &a); }; void fun(A &a) { cout<<"fun():a中的i"<<a.i<<endl; } int main() { A a(3); fun(a); return 0; } // 对于那些非成员函成为类的友元的话,那些类要在非成员函数前面定义,因为我们需要函数中调用该对象的。 总结就是:对于类成为友元的话,比如A要成为B的友元,那B要在A前面定义,因为A可能会用到B的元素。 对于成员函数的友元的话,假如A类中的成员函数要成为B类的友元函数的话,那么需要先把那个A定义出来 定义完了之后就是友元的类,之后就是友元的成员函数的定义。 对于非成员函数成为友元的话就是该函数成为类A的友元的话,那个A类要先定义。