C++——友元

目录

友元

友元函数

友元函数使用案例

友元类


友元

        友元是C++提供的一种突破封装(突破类域)的方式,有时提供了便利。但是友元会增加耦合度,但破坏了封装,所以友元不宜多用。友元分为友元函数友元类

友元函数

        友元函数可以直接访问类的私有成员和保护成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字

友元函数使用案例

        在类内尝试去重载operator<<时,发现没办法将operator<<重载成成员函数。因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置this指针默认是第一个参数也就是左操作数了。如果我们要使用只能写为:对象名<<cout或者对象名.operator<<(cout)比如下图:

        但是我们实际使用中cout时,要写成:cout<<对象,在我们上述代码中,在类内部对operator<<重载后的使用,与实际使用不符;所以我们需要coutoperator<<的第一个形参对象,这样才能正常使用。

        综上所述,我们要将operator<<重载成全局函数,但这样又会导致类外没办法访问类内的成员,此时就需要友元来解决,让类内可以访问到operator<<。operator>>同理。实现如下图所示:

友元函数特点:

        友元函数访问类的私有和保护成员,但不是类的成员函数

        友元函数不能用const修饰,因为没有this指针

        友元函数可以在类定义的任何地方声明不受类访问限定符限制

        一个函数可以是多个类的友元函数的结合

        友元函数的调用与类内的普通成员函数的调用原理相同

友元类

        友元类是指一个类都是另一个类的朋友,这种关系是单向的、不能传递的。被声明的友元类可以访问到当前类的对象,而当前类不能访问到友元类,即我被你声明为友元类,我可以访问到你,但你不能访问到我

        如下图所示,在Time中声明了友元类Date,所以Date可以访问到Time,但Time不能访问到Date,这是单向的。不能传递时指,如果类A是类B的友元,类B是类C的友元,但类A和类C没有关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值