为什么 ofstream 中的 << 运算符不是常量?
Why << operator in ofstream is not const?
我注意到 ofstream
中的 operator <<
不是 const
。很明显,这个运算符会改变文件的内容,但是它在 ofstream
对象内部改变了什么?
换句话说,如果我有 ofstream
作为 class 成员函数并且我想在 const
成员函数中调用 << operator
我有将其更改为 non-const
成员函数或将 ofstream
标记为 mutable
但从抽象的角度来看对我来说似乎不合逻辑..我错过了什么吗?
因为它在逻辑上改变了流。至少,它会更改流缓冲区中的写入位置。它还可以修改流的状态(例如,发生写入错误时)。
但更重要的(在我看来)是逻辑可变性。流在写入后不一样了——它有了新的价值。如果您的 class 不关心这个事实,您可以声明您的流成员 mutable
.
因为它可能调用setstate()
which isn't const
for a reason since it changes the internals of the object as noted in the formatting part for streams.
请记住,虽然 ofstream
本身不必修改才能写入(即使可能应该修改),但 ostringstream
也继承了 <<
来自 ostream
class 的运算符必须修改才能写入,因为您需要更改内部 string
对象。因此,必须声明运算符 const
以涵盖所有情况(运算符在 ostream
class 中定义)。
我注意到 ofstream
中的 operator <<
不是 const
。很明显,这个运算符会改变文件的内容,但是它在 ofstream
对象内部改变了什么?
换句话说,如果我有 ofstream
作为 class 成员函数并且我想在 const
成员函数中调用 << operator
我有将其更改为 non-const
成员函数或将 ofstream
标记为 mutable
但从抽象的角度来看对我来说似乎不合逻辑..我错过了什么吗?
因为它在逻辑上改变了流。至少,它会更改流缓冲区中的写入位置。它还可以修改流的状态(例如,发生写入错误时)。
但更重要的(在我看来)是逻辑可变性。流在写入后不一样了——它有了新的价值。如果您的 class 不关心这个事实,您可以声明您的流成员 mutable
.
因为它可能调用setstate()
which isn't const
for a reason since it changes the internals of the object as noted in the formatting part for streams.
请记住,虽然 ofstream
本身不必修改才能写入(即使可能应该修改),但 ostringstream
也继承了 <<
来自 ostream
class 的运算符必须修改才能写入,因为您需要更改内部 string
对象。因此,必须声明运算符 const
以涵盖所有情况(运算符在 ostream
class 中定义)。