[C++]关于友元的总结
友元就是让本该不能访问类的私有成员、保护成员的函数或者类,通过声明它为友元的方式,使得他们能够访问这些私有、保护成员。使用友元其实就是破坏封装,应尽量避免使用。
友元有多重形式,经常会造成混乱,其实总结来说,就是三种程度的破坏封装:
1、声明一个普通函数作为类的友元(最高程度破坏封装)
class INTEGER { private: int num; public: friend void Print(const INTEGER& obj);//声明友元函数 INTEGER(){ num=999; } }; void Print(const INTEGER& obj)//不使用friend和类:: { //函数体 cout<<obj.num<<endl;//输出999 }
这个友元函数相当于一个全局函数,并不是类成员函数,没有this指针。调用这个函数的时候不需类对象或类标示符,直接用函数名调用即可。但此函数可以访问类的私有变量。由于友元函数没有this指针,所以一般使用参数来传递类对象。
2、声明一个类为友元(允许一个类破坏封装)
class girl; class boy { private: int age; public: boy(); void disp(girl &); }; void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数 { cout<<x.age<<endl; //借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量 //正常情况下,只允许在girl的成员函数中访问girl的私有变量 } class girl { private: int age; friend boy; //声明类boy是类girl的友元 public: girl(); };
声明一个类为另一个类的友元,友元类的所有成员函数可以访问另外一个类的私有成员。
3、声明一个类的成员函数为一个类的友元(只允许该类的该函数破坏封装)
class girl; class boy { private: char *name; int age; public: boy(); void disp(girl &); }; void boy::disp(girl &x) //函数disp()为类boy的成员函数,也是类girl的友元函数 { cout<<"boy's name is:"<<name<<",age:"<<age<<endl;//正常情况,boy的成员函数disp中直接访问boy的私有变量 cout<<"girl's name is:"<<x.name<<",age:"<<x.age<<endl; //借助友元,在boy的成员函数disp中,借助girl的对象,直接访问girl的私有变量 //正常情况下,只允许在girl的成员函数中访问girl的私有变量 } class girl { private: char *name; int age; friend boy::void disp(girl &); //声明类boy的成员函数disp是类girl的友元函数 public: girl(); };