目录
友元
友元函数
友元函数使用案例
友元类
友元
友元是C++提供的一种突破封装(突破类域)的方式,有时提供了便利。但是友元会增加耦合度,但破坏了封装,所以友元不宜多用。友元分为友元函数和友元类。
友元函数
友元函数可以直接访问类的私有成员和保护成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字
友元函数使用案例
在类内尝试去重载operator<<时,发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数,也就是左操作数了。如果我们要使用只能写为:对象名<<cout或者对象名.operator<<(cout),比如下图:
但是我们实际使用中cout时,要写成:cout<<对象,在我们上述代码中,在类内部对operator<<重载后的使用,与实际使用不符;所以我们需要cout是operator<<的第一个形参对象,这样才能正常使用。
综上所述,我们要将operator<<重载成全局函数,但这样又会导致类外没办法访问类内的成员,此时就需要友元来解决,让类内可以访问到operator<<。operator>>同理。实现如下图所示:
友元函数特点:
友元函数可以访问类的私有和保护成员,但不是类中的成员函数
友元函数不能用const修饰,因为没有this指针
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数的结合
友元函数的调用与类内的普通成员函数的调用原理相同
友元类
友元类是指一个类都是另一个类的朋友,这种关系是单向的、不能传递的。被声明的友元类可以访问到当前类的对象,而当前类不能访问到友元类,即我被你声明为友元类,我可以访问到你,但你不能访问到我。
如下图所示,在Time中声明了友元类Date,所以Date可以访问到Time,但Time不能访问到Date,这是单向的。不能传递时指,如果类A是类B的友元,类B是类C的友元,但类A和类C没有关系。