使用朋友函数在c ++中重载I / O操作符
我自己学习c ++。 我正在研究运算符重载,我能够理解加减运算符的重载。 但I / O操作员的过载有点令人困惑。 我创建了复杂数字的类,现在我正在重载运算符。
Complex.h中的函数原型
friend ostream& operator<<(ostream&, const Complex&);
来自Complex.cpp的函数
ostream& operator<<(ostream& os, const Complex& value){
os << "(" << value.r <<", "
<< value.i << ")" ;
return os;
}
对于friend ostream& operator<<(ostream&,const Complex&);
:
因为你在这里声明了一个自由函数,并且希望它访问Complex
对象的内部(private / protected)。 对于那些超载有“自由功能”是非常常见的,但肯定不是强制性的。
因为流是不可复制的(它没有意义,请参阅这篇文章),按值传递需要一个副本。 通过价值传递Complex
也需要一个无用的副本。
因为那些输出操作符不应该修改它们正在处理的对象(显然,输入操作符),所以添加const
以确保它。
您不必将流媒体运营商视为朋友。 它必须在外部声明,因为Complex对象位于操作符的右侧。
但是,如果您的Complex类有一种访问所需成员的方法(可能通过getter),则可以让流式运算符使用它们。 说:
std::ostream& operator<<( std::ostream& os, Complex const& cpx )
{
return os << cpx.getReal() << ',' << cpx.getImaginary();
}
您的operator/
重载可以作为一个内部函数完成,但实际上也可以更好地实现为具有两个const&参数的外部函数。 如果它是一个成员函数,它需要是一个const成员。 你的不是。
您可以基于operator /=
来实现它
Complex operator/ ( Complex const& lhs, Complex const& rhs )
{
Complex res( lhs );
res /= rhs; // or just put return in front of this line
return res;
}
任何人都可以解释为什么我们必须在这里使用朋友功能?
如果您需要访问operator<<
中Complex
私有成员。
2.为什么我们必须通过运营商参考?
为了效率。 通过const引用传递比通过用户定义类型的值传递要快。
这个函数在不使用const的情况下工作正常,但为什么我们在这里使用const? 将Complex作为常量对象传递的优点是什么?
如果你不这样做,你不能输出一个const对象,比如:
const Complex c;
std::cout << c;
链接地址: http://www.djcxy.com/p/73109.html
上一篇: Using friend functions for I/O operator overloading in c++