C++ 运算符 I/O 重载

C++ operator I/O overloading

我在为 Complex class 重载 << 运算符时遇到了一个奇怪的问题(复杂的 class 和重载功能并不完整,但意思应该是一样的 - 但是如果你觉得缺少一些重要的部分,请提示我 ;-) ):

class Complex {
    float m_fReal;
    float m_fImaginary;
public:
    Complex();
    Complex(float real, float imaginary);
    Complex add(Complex) const;

    friend std::ostream& operator<< 
          (std::ostream& out, Complex cComplex);
};

重载函数:

std::ostream& operator<<(std::ostream& out, Complex cComplex) {
    out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
    return out;
}

添加功能:

Complex Complex::add(Complex cComplex) const {
    return Complex (m_fReal + cComplex.m_fReal,
                    m_fImaginary + cComplex.m_fImaginary);
}

主函数调用:

Complex x(1,1), y(2,2);
cout << "x+y=" << x.add(y) << endl;

虽然上面的方法可行,但这个不行(只有不同​​的部分)。

Complex中的声明class:

friend std::ostream& operator<< 
      (std::ostream& out, Complex& cComplex);

定义:

std::ostream& operator<<(std::ostream& out, Complex& cComplex) {
    out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
    return out;
}

我的意图是通过引用传递 Complex class。谁能给我解释一下,这段代码出了什么问题,为什么?

您需要通过const引用接受要输出的对象。您将其作为非常量引用接受,add 中的 return 无法绑定到该引用。

std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {

这 design/behavior 是为了防止函数期望改变引用参数的值,但引用已绑定到未命名的临时对象,换句话说,内存无法访问的错误再次,使更改毫无意义。

你的定义应该是

std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
  out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
  return out;
}

cComplex 需要是 const 限定的,您才能使用“.”访问它的私有变量。