使用朋友函数在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;
}
  • 任何人都可以解释(在基本层面上)为什么我们必须在这里使用朋友函数声明?
  • 为什么我们必须通过引用来传递操作符的所有参数和返回类型?
  • 这个函数在不使用const的情况下工作正常,但为什么我们在这里使用const? 将Complex作为常量引用传递的优点是什么?

  • 对于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++

    下一篇: Overloading custom string operator += in c++