C++——运算符重载(三)

本文探讨了C++中友元函数的概念及其应用场景,包括解决运算符重载中的特定问题和实现类间数据共享。此外,还介绍了如何利用友元函数支持链式编程。

知识点: 1.友元函数 2.链式编程

前面介绍了运算符重载有两种实现方法:成员函数和友元函数
一句话总结:当两种方法都能实现运算符重载时,请使用成员函数这种方式实现,忘了友元函数。
那么友元函数的出现是为了解决什么难题的?
友元函数总结
1.为什么有友元函数?
在实现类之间数据共享时,减少系统开销,提高效率。
下面两种情况需要使用友元函数:(1)运算符重载的某些特殊场合需要使用友元函数。(2)两个类要共享数据的时候。
2.友元函数缺点
friend关键字实际上是编译器开的后门,为执行特殊任务出现的。
友元函数破环了封装机制,尽量不使用友元函数,除非不得已的情况下才使用友元函数
3.友元函数的位置与调用
位置:为友元函数是类外的函数,所以它的声明可以放在类的私有段或公有段,没有区别
调用:可以直接调用友元函数,不需要通过对象或类名,可以当做是全局函数来理解。
4.与成员函数的区别
由于不是成员函数,类似全局函数,友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友

场景1:
Complex c(10,20);
cout<<c;
很明显,这里需要重载<<,用成员函数这种方式实现,函数原型如下:
cout.operator<<(Complex & c);
问题出来了,没有办法在ostream类中去增加重载<<的函数。
实际上,只要是左操作数的抽象类无法得到,就没有办法通过成员函数这种方式来实现运算符的重载。这种情况下就只能使用友元函数这种方式来实现运算符的重载了。
函数原型如下:
void friend operator <<(ostream& out,Complex& c);
模拟实现:
void friend operator <<(ostream& out,Complex& c)
{
        out<<c.real_<<endl;
        out<<c.imag_<<endl;
}
场景2cout<<c<<"111";
要支持链式编程,需要对函数返回值做手脚。
friend ostream& operator <<(ostream& out,Complex& c);
说明:函数返回值当左值时,要求返回一个引用或地址(需要再分配内存空间)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值