我注意到operator <<
中的ofstream
不是const
。很明显,此运算符将更改文件的内容,但它在ofstream
对象中的变化是什么?
换句话说,如果我有ofstream
作为类成员函数,并且我想在<< operator
成员函数内调用const
,我必须将其更改为{{ 1}}成员函数或将non-const
标记为ofstream
但从抽象的角度来看似乎不合逻辑..我错过了什么吗?
答案 0 :(得分:8)
因为它在逻辑上改变了流。至少,它改变了流缓冲区中的写入位置。它还可以修改流的状态(例如,在发生写入错误时)。
但更重要的是(在我看来)是逻辑上的可变性。写入后流不一样 - 它具有新值。如果您的班级不关心此事实,您可以声明您的信息流成员mutable
。
答案 1 :(得分:1)
因为它可以调用setstate()
而不是const
,因为它改变了对象的内部结构,如the formatting part for streams中所述。
答案 2 :(得分:0)
请记住,虽然ofstream
本身不需要修改即可写入(即使它可能应该),但ostringstream
也继承了<<
运算符必须修改ostream
类才能编写,因为您需要更改内部string
对象。因此,必须声明运算符const
以涵盖所有情况(运算符在ostream
类中定义)。