Перегрузка потокового оператора - PullRequest
6 голосов
/ 24 июля 2010

Почему перегрузка потоковых операторов (<<, >>) должна оставаться друзьями, а не делать их членами класса?

Ответы [ 3 ]

9 голосов
/ 24 июля 2010

Когда вы перегружаете бинарный оператор как функцию-член класса, перегрузка используется, когда операнд first относится к типу класса.

Для потоковых операторов первым операндом является поток, а не (обычно) пользовательский класс.

По этой причине перегруженные потоковые операторы для пользовательских классов, которые предназначены для обычного использования, не могут быть функциями-членами пользовательского класса, они должны быть свободными функциями.

(Я предполагаю, что потоковые классы не открыты для изменения; если бы они были, вы могли бы добавить функции-члены в потоковые классы, чтобы справиться с дополнительными пользовательскими типами, но это обычно нежелательно с точки зрения зависимости.)

То, являются ли они друзьями, должно зависеть от того, нужен ли им доступ непубличным членам класса.

2 голосов
/ 24 июля 2010

Итак, вы можете сказать:

some_stream << my_class;

Обратите внимание, что определение операторов-членов делает левый класс самим классом. e.g.:

my_class << some_stream;

Это не то, как должны работать стандартные потоки.

0 голосов
/ 24 июля 2010

Члены какого класса?Каков тип левого операнда?

Они не обязательно должны быть friend, если только нет необходимости обращаться к недоступным в противном случае частным данным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...