[英]“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
例如os
是ofstream
输出缓冲区或文件写入位置。
将os
声明为const
禁止进行此类修改。
而且,如图所示这里 ,如果os
被声明为const
,那么你不能因为没有使用的输出基本数据类型ostream::operator<<()
被声明为常量成员函数。
是的,可以通过调用<<来修改ostream参数os。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.