0

来自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)

上面的声明有问题吗?

谢谢

4

3 回答 3

2

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

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
}
于 2012-07-30T00:15:57.587 回答
1

输出变量时,必须修改其中的rhs一些数据成员,ostream& os例如输出缓冲区或文件写入位置。osofstream

声明osconst禁止此类修改。

而且,如此处所示如果os声明为const,则不能使用它来输出原始数据类型,因为没有一个ostream::operator<<()被声明为常量成员函数。

于 2012-07-30T00:12:23.050 回答
0

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

于 2012-07-30T00:09:54.730 回答