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各成员;