>> и << оператор перегрузки - PullRequest
3 голосов
/ 01 ноября 2010

Я просто провел тест для своего класса программирования и неправильно понял этот вопрос:

Тип возврата функции в перегрузка оператора << должна быть ссылка на объект ostream.

Мне это не кажется правильным. Конечно, C ++ немного более открытый, чем этот. Но я все равно решил спросить здесь. Как это правильно (или неправильно)? Мои знания C ++ начинают по-настоящему исчезать, когда дело доходит до перегрузки операторов ..

Ответы [ 6 ]

16 голосов
/ 01 ноября 2010

В C ++ не требуется, чтобы возвращаемый тип являлся ссылкой на объект ostream. Однако, если вы пытаетесь сделать что-то вроде:

cout << instance_of_custom_type << 3 << "hi" << endl;

Тогда вам понадобится:

ostream &operator << (ostream &os, custom_type &t);

Однако, если вы делали что-то вроде написания большого целочисленного типа и хотели бы поддерживать сдвиг битов, это может быть что-то вроде:

BigInt operator << (const BigInt &i, unsigned int shift);

Чтобы расширить это немного, оригинальное использование оператора << предназначено для сдвига битов. 1 << 8 равно 256, например. C ++ добавил (немного сбивающее с толку) второе использование для этого и перегрузил его на ostream, что означает «вывод» в поток. Внутри перегруженного оператора вы можете делать все что угодно - он работает точно так же, как и функция, однако к операторам прилагается человеческое ожидание: в C ++ программисты ожидают, что << это сдвиг битов или вывод потока.

2 голосов
/ 01 ноября 2010

Тип возврата функции для перегрузки оператора << должен быть ссылкой на объект ostream.

Сказать «должен» неверно, вероятно, «обычно» - правильное слово, и почему? Поскольку, как уже было указано в большинстве ответов, это дает удобство object chaining при работе с iostreams.

2 голосов
/ 01 ноября 2010

Наличие возвращаемого типа в качестве ссылки на тот же объект потока, переданного в качестве ссылочного аргумента перегруженному оператору вставки, позволяет нам писать код, такой как

mystream &operator << (mystream &os, myclass &myobject){
   // do whatever
   return os;
}

mystream << myobject << fundamental_type_object;
1 голос
/ 01 ноября 2010

С более общей точки зрения, operator<< всегда должен возвращать свой левый операнд для цепочки вызовов, как operator=.

При работе с библиотекой <iostreams> этобывает ссылкой на std::ostream.

0 голосов
/ 01 ноября 2010

Это не правильно.Это правильно только в контексте iostreams, которые по моему, вероятно, неуместному и неинтересному мнению никогда не должны были быть выпущены из клетки в такой форме.Если вы не включили iostreams в свой код, вы можете делать то, что вам нравится.Но я бы не стал перегружать эти операторы для выполнения чего-либо, кроме классов сдвига, что бы это ни значило, целочисленными значениями или, может быть, классами, которые можно каким-то образом уменьшить до целочисленных значений.

0 голосов
/ 01 ноября 2010

Цель, чтобы он возвращал ссылку ostream, чтобы вы могли связать их вместе. В противном случае вам придется написать cout << 1; cout << " is a number"; cout << endl

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