Форум программистов, компьютерный форум CyberForum.ru

Перегрузка << - C++

Восстановить пароль Регистрация
 
АТерентьев
20 / 19 / 1
Регистрация: 16.10.2009
Сообщений: 933
18.06.2010, 20:34     Перегрузка << #1
Заинтересовала конструкция , использованная как перегрузка оператора "<<" для вывода записей, состоящих из трех строковых полей:

C++
1
2
3
4
5
6
7
ostream &operator<<(ostream &stream, address &ob)
{
  cout << ob.name<<endl;
  cout << ob.street<<endl;
  cout << ob.street<<endl;
  return stream;
}
Если теперь addr - это указанный тип записи, то одной командой можно вывести все три строковых поля :

C++
1
2
3
address addr;
...
cout<<addr;
то

Я полагал , что команда (в реализации перегрузки "<<")

C++
1
 cout << ob.name<<endl;
просто выводит строковую переменную на экран, но оказывается, что она "перехватывает"
stream и возвращает его командой
C++
1
return stream
.

Был очень благодарен, если кто-то прокомментировал этот факт.
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2010, 20:34     Перегрузка <<
Посмотрите здесь:

[C++] перегрузка + C++
C++ Перегрузка
Перегрузка в c++ C++
C++ Перегрузка
перегрузка в с++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
18.06.2010, 20:53     Перегрузка << #2
Приведенный код содержит ошибку. Правильно должно быть так:
C++
1
2
3
4
5
6
7
ostream &operator<<(ostream &stream, address &ob)
{
  stream << ob.name << endl;
  stream << ob.street << endl;
  stream << ob.street << endl;
  return stream;
}
АТерентьев
20 / 19 / 1
Регистрация: 16.10.2009
Сообщений: 933
18.06.2010, 21:54  [ТС]     Перегрузка << #3
Спасибо! Так оно понятно - ошибка в учебнике.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
18.06.2010, 22:39     Перегрузка << #4
Операция << имеет всего два операнда. Так что если мы хотим писать цепочку вида cout << var1 << var2 << var3; , да ещё и чтобы значения разного типа туда кидать, то надо учитывать, что она разбивается на последовательность операций таким образом: ((сout << var1) << var2) << var3;
Значит, выражение в скобках должно иметь такой тип, чтобы к нему была применима операция << и к тому же чтобы она имела тот же смысл, что и для ostream. Некий кэп подсказывает нам, что проще всего возвращать из операции << тот же самый объект, что занимается выводом, а точнее - ссылку на него. Тогда к этому результату можно прицеплять дальнейшие операции, применимые к этому объекту, которые в свою очередь вернут его же, чтобы можно было прицепить ещё одну операцию и так далее ad infinitum.
Yandex
Объявления
18.06.2010, 22:39     Перегрузка <<
Ответ Создать тему
Опции темы

Текущее время: 13:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru