1、友元函数介绍:
1.1为什么使用友元函数?
在类之间实现数据共享,减少系统开销,提高效率。即一个类可以无限制的存取另一个类的成员。例如:如果类A是类B的友元函数,那么类A中该函数是类B的友元函数。也就是说A的成员函数可以直接访问B类的私有变量、公有成员和公有成员。
1.2友元函数的优缺点?
优点:提高效率,表达简单、清晰。
缺点:破坏了封装和数据隐藏,导致程序的可维护性变差。
2、友元函数图解:
func()函数是该类的外部函数,友元函数能够访问friend所在类(Two)的所有对象的私有成员、公有成员和保护成员。
3、友元函数的使用
3.1类本身的友元函数
目的:使普通函数能够访问类的成员
声明:friend + 普通函数
实现位置:类内或类外
调用:直接调用
代码:
class Two { friend void Print(Const Two& obj); }; void Print(Const Two& obj) { //函数体 } void main() { Two obj; Print(obj);//直接调用 }
3.2将成员函数用作友元
目的:是类One的一个成员函数称为类Two的友元,使该函数直接访问Two的私有变量
声明:friend + 成员函数的声明
声明位置:声明在公有中
调用:先声明One对象one ---- 使用one调用个自己的成员函数
class One{ void func(Two&); //声明本类的成员函数,参数为Two类的引用 } class Two { friend void One::func(Two&); }; void main() { One Obj1(5); Two Obj2(8); Obj1.func(Obj2); }
3.3将一个类说明为另一个类的友元
目的:使用单个声明One类是Two类的友元,则One 这个类的成员函数均具有友元函数的性能。
声明:friend + 类名
声明位置:另一个类的公有或私有均可
class Two{ private: int y; public: friend class One; //声明One为Two的友元 } class One { private: int x; public: One(int a,Two&r,int b) { x=a; r.y =b; } void Display(Two&r); }; void One::Display(Two&r) { cout<<x<<""<<r.y<<endl; } void main() { Two Obj2; One Obj1(2,Obj2,5); Obj1.Display(Obj2);//直接调用函数 }
4、友元函数总结:
4.1友元函数不是成员函数
4.2成员函数有this指针,而友元函数没有this指针
4.3友元函数不能被传递,也不具有交换性