2016-12-28 3 views
2

Я заметил, что operator << в ofstream не const. Очевидно, что этот оператор изменит содержимое файла, но что он меняет внутри объекта ofstream?Почему << оператор в потоке не const?

Другими словами, если у меня есть ofstream как функции члена класса, и я хочу, чтобы вызвать << operator на ней внутри функции в const член я должен изменить его non-const функции члена или пометить ofstream как mutable но это, кажется, не логично с абстрактной точки зрения для меня .. я что-то пропустил?

+0

По крайней мере, это будет изменение содержимого буфера объекта потока. –

+0

Он также может изменить статус, если сбой записи. –

+0

@latedeveloper должен ли я знать его внутренний буфер? Я имею в виду, что они могут сделать его изменчивым, поскольку это очень внутренняя вещь –

ответ

8

Потому что это логически изменяет поток. До минимума он меняет положение записи в буфере потока. Он также может изменять статус потока (например, при записи ошибки).

Но что еще более важно (на мой взгляд) является логической изменчивостью. Поток не то же самое после написания - он имеет новое значение в нем. Если ваш класс не заботится об этом факте, вы можете объявить своего участника потока mutable.

1

Потому что он может позвонить setstate(), который не является const по той причине, что он изменяет внутренности объекта, как указано в the formatting part for streams.

0

Имейте в виду, что в то время как ofstream сам не должен быть изменен, чтобы быть записаны (хотя это, вероятно, должно быть), то ostringstream который также наследует оператор << из ostream класса должен быть изменен для того, чтобы записать to, так как вам нужно изменить внутренний объект string. В связи с этим оператор должен быть объявлен const для покрытия всех случаев (оператор определен в классе ostream).

Смежные вопросы