【问题标题】:"Essential C++": Providing Class Instances of the iostream Operators“基本 C++”:提供 iostream 运算符的类实例
【发布时间】:2012-07-27 16:20:37
【问题描述】:

来自Essential C++: 4.10 提供 iostream 运算符的类实例

通常,我们希望同时读取和写入类的对象。例如, 要显示我们的 trian 类对象,我们希望能够编写

cout << train << endl;

为了支持这一点,我们必须提供输出的重载实例 运营商:

ostream& operator<< (ostream &os, const Triangular &rhs)
{
    os << "(" << rhs.beg_pos() << "," << rhs.length() << ")";
    rhs.display(rhs.length(), rhs.beg_pos(), os);
    return os;
}

我们返回传递给函数的相同 ostream 对象。这 允许连接多个输出运算符。两个对象都是 通过引用传递。 ostream 操作数未声明为 const 因为每个输出操作修改的内部状态 ostream 对象。

我有点困惑为什么不能将 ostream 操作数声明为 const。 如果输出操作符声明如下:

const ostream& operator<< (const ostream &os, const Triangular &rhs)

上面的声明有问题吗?

谢谢

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    问题在于,如果ostream 参数(或相反的istream)是一个常量引用,那么操作员将无法修改流对象。对流的插入/提取修改流状态,因此现有的operator&lt;&lt; 是非常量操作。这反过来意味着虽然你可以声明甚至定义

    std::ostream const & operator<<( std::ostream const & s, Type const & t );
    

    问题在于定义实际上无法将任何内容写入到流中:

    std::ostream const & operator<<( std::ostream const & s, Type const & t ) {
       s << "Hi";     // Error: operator<<( std::ostream&, const char*) requires a
                      //        non-const `std::ostream&`
       return s;      // This is fine
    }
    

    【讨论】:

      【解决方案2】:

      当输出变量rhs时,必须修改ostream&amp; os内部的一些数据成员,例如输出缓冲区或文件写入位置,如果osofstream

      os 声明为const 禁止这样的修改。

      并且,如图here 所示,如果os 被声明为const,那么您不能使用它来输出原始数据类型,因为ostream::operator&lt;&lt;() 都没有被声明为常量成员函数。

      【讨论】:

        【解决方案3】:

        是的,ostream参数os是通过调用修改的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-17
          • 2015-06-03
          • 1970-01-01
          • 1970-01-01
          • 2015-12-25
          • 2020-03-04
          • 1970-01-01
          相关资源
          最近更新 更多