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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
АТерентьев
20 / 19 / 1
Регистрация: 16.10.2009
Сообщений: 947
#1

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

18.06.2010, 20:34. Просмотров 496. Ответов 3
Метки нет (Все метки)

Заинтересовала конструкция , использованная как перегрузка оператора "<<" для вывода записей, состоящих из трех строковых полей:

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++ C++
C++ Перегрузка +
C++ перегрузка []
C++ перегрузка >> и <<
Перегрузка () C++
Перегрузка + C++
C++ Перегрузка ++ и --

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2910 / 1238 / 78
Регистрация: 27.05.2008
Сообщений: 3,321
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
Сообщений: 947
18.06.2010, 21:54  [ТС]     Перегрузка << #3
Спасибо! Так оно понятно - ошибка в учебнике.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,910
Завершенные тесты: 1
18.06.2010, 22:39     Перегрузка << #4
Операция << имеет всего два операнда. Так что если мы хотим писать цепочку вида cout << var1 << var2 << var3; , да ещё и чтобы значения разного типа туда кидать, то надо учитывать, что она разбивается на последовательность операций таким образом: ((сout << var1) << var2) << var3;
Значит, выражение в скобках должно иметь такой тип, чтобы к нему была применима операция << и к тому же чтобы она имела тот же смысл, что и для ostream. Некий кэп подсказывает нам, что проще всего возвращать из операции << тот же самый объект, что занимается выводом, а точнее - ссылку на него. Тогда к этому результату можно прицеплять дальнейшие операции, применимые к этому объекту, которые в свою очередь вернут его же, чтобы можно было прицепить ещё одну операцию и так далее ad infinitum.
Yandex
Объявления
18.06.2010, 22:39     Перегрузка <<
Ответ Создать тему
Опции темы

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