перегрузка по потоку - PullRequest
0 голосов
/ 26 мая 2011
friend ostream& operator<<(ostream& os, MyClass& obj);

У меня есть несколько вопросов:
1. Почему мне нужно написать «друг»?
2. Почему мне нужно написать «&» перед «оператором», «ОС» и'OBJ'?

Ответы [ 2 ]

0 голосов
/ 26 мая 2011

. Почему мне нужно написать «друг»?

ostream изменяет левый аргумент (изменяет состояние потока), и, следовательно, в соответствии с общей семантикой перегрузки операторов он должен быть реализован как член типа левого операнда. Однако его левый операнд является потоком из стандартной библиотеки, когда вы реализуете операции вывода и ввода для своего собственного типа, вы не можете изменить типы потоков стандартной библиотеки. Вот почему вам нужно реализовать эти операторы для ваших собственных типов как функции, не являющиеся членами.

0 голосов
/ 26 мая 2011

& в MyClass& заставляет функцию принимать ссылку на объект MyClass, а не на сам объект.(Аналогично для остальных.)

Ссылки легки для распространения, и любое изменение, которое вы вносите в obj, влияет на исходный объект.Без & вы бы указали компилятору создать совершенно новый MyClass в вызове, уничтожить его по возвращении и выбросить любые изменения, которые вы могли внести в его внутреннее состояние.

Возвращениеostream& обычно используется для возврата того же ostream, который был передан, так что вы можете написать цепочки сдвигов вроде cout << "hello " << 42 << endl; и заставить их вести себя так, как вы ожидаете.(Вы могли бы заставить его вернуть что-то другое - C ++ облегчает полный беспорядок с ожиданиями людей - но не делайте этого.)

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