c++ - 为什么 operator<< 的重载必须通过引用返回?

标签 c++ overloading operator-keyword

我想打印出一个用户定义类型的对象,像这样 cout << ob1; 所以我想重载 operator<< 并且我想按值而不是按引用返回,但它给了我一个错误:在两个名为 iosfwdios_base.h

ostream operator<<( ostream& out, cat& rhs){
    out << rhs.a << ", " << rhs.b << endl;
    return out ; 
}

1)是不是因为不能创建新的ostream对象,所以要按引用返回?

但是当我像这样通过引用返回时:

ostream& operator<<( ostream& out, cat& rhs){
    out << rhs.a << ", " << rhs.b << endl;
    return out ;
}

它工作正常。
2)有什么解释吗?

最佳答案

在第一个示例中,您返回了不允许的流对象拷贝,因为 C++ 中所有 流类的复制构造函数(以及复制赋值)已被禁用让他们制作private .

由于您无法制作流对象的拷贝,因此您需要通过引用 返回它,这是您在第二个示例中所做的,这就是它工作正常的原因。

您可以选择什么都不返回(即您可以将返回类型设置为 void ),但如果您这样做,那么您将无法链接stream << a << b .您必须将它们分别写为 stream <<a然后 stream << b .

如果您想知道为什么无法复制流对象,请在此处查看我的回答:

关于c++ - 为什么 operator<< 的重载必须通过引用返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646893/

相关文章:

c - C 中的 OR 运算符

c++ - 拆分内联非成员运算符的声明和定义的正确方法(链接器问题)

javascript - 模运算符报告具有负值的不同结果

c++ - 编译时的C++字符串连接

c++ - 抛出一个 catch block (C++)是否有效?

c++ - 具有析构函数和新运算符的类。

c++ - 在 cpp 中重载 << 运算符的正确方法是什么

C++ RNG (Mersenne Twister) 需要种子

c++ - 使用谷歌测试来检查回调

c++ - 如何重载继承类中的方法,以便基类看到继承的版本?