知识点: 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;
}
场景2:
cout<<c<<"111";
要支持链式编程,需要对函数返回值做手脚。
friend ostream& operator <<(ostream& out,Complex& c);
说明:函数返回值当左值时,要求返回一个引用或地址(需要再分配内存空间)
本文探讨了C++中友元函数的概念及其应用场景,包括解决运算符重载中的特定问题和实现类间数据共享。此外,还介绍了如何利用友元函数支持链式编程。

被折叠的 条评论
为什么被折叠?



