"Essential C++" : 提供 iostream 运算符的类实例

"Essential C++": Providing Class Instances of the iostream Operators

本文关键字:实例 运算符 提供 Essential C++ iostream      更新时间:2023-10-16

来自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对象。这允许连接多个outptu运算符。两个对象都是通过引用传递ostream操作数未声明为const因为每个输出操作都会修改ostream对象

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

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

上述声明有什么问题吗?

感谢

问题是,如果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
}

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

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

并且,如图所示,如果os被声明为const,则不能使用它来输出基元数据类型,因为ostream::operator<<()都没有被声明为常量成员函数。

是的,通过调用<lt;。