繁体   English   中英

“基本C ++”:提供iostream运算符的类实例

[英]“Essential C++”: Providing Class Instances of the iostream Operators

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)

上面的声明有什么问题吗?

谢谢

问题在于,如果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 ,必须修改ostream& os内部的某些数据成员ostream& os例如osofstream输出缓冲区或文件写入位置。

os声明为const禁止进行此类修改。

而且,如图所示这里 ,如果os被声明为const ,那么你不能因为没有使用的输出基本数据类型ostream::operator<<()被声明为常量成员函数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM