2010-11-01 3 views
3

Я просто сделал викторины для моего класса программирования и получил этот вопрос неправильно:>> и << оператор перегрузки

Возвращаемый тип функции для перегрузить оператор << должен стать ссылкой на ostream object.

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

+2

Звучит как плохо сформулированный вопрос для меня, учитель явно имел в виду это в контексте операторов потока, но не указал это явно. Перегрузка оператора не приводит к таким ограничениям, и поэтому ответ был верным, я призываю вас уведомить их о своей глупости :) – radman

+0

@radman Я отправил письмо своему учителю по этому вопросу и дождался ответа сейчас – Earlz

ответ

15

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++ << - это сдвиг бит или поток.

+0

Это, как мне кажется, викторина подразумевала, но сформулировала это неоднозначно .. – Earlz

0

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

2

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

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

mystream << myobject << fundamental_type_object; 
1

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

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

0

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

2

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

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

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