перегрузка оператора для манипуляторов - PullRequest
5 голосов
/ 28 марта 2012

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

#include<iostream> 
ostream & symbol(ostream & output)
{
  return output << "\tRs";
}

он работает нормально.Следующее утверждение

  cout << "Total amount: " << 567 << symbol; 

дает вывод

 Total amount: 567   Rs

Но я не понял, почему это работает.У меня есть следующая информация о перегрузке операторов в C ++.

  1. только существующие операторы могут быть перегружены.Новые операторы не могут быть созданы.Но символ не является существующим оператором.

  2. В выписке ( cout << "Общая сумма:" << 567 << символ; </em>) кажется, что << </em>является перегруженным оператором, а символ является переменной / объектом.Но я не объявлял symbol как переменную / объект.

  3. почему они используют оператор return ( return output << "\ tRs"; </em>) ?.Я думаю ( return "\ tRs"; ) или ( output << "\ tRs"; </em>) должны работать. (Я пытался, но не работал :))

На самом деле я не знаю, как работает приведенный выше код.Есть ли кто-нибудь, чтобы объяснить работу перегрузки вышеуказанного оператора?

Ответы [ 3 ]

7 голосов
/ 28 марта 2012

Вы передаете функцию symbol оператору <<. << будет вызывать эту функцию для текущего ostream (с объектом ostream в качестве параметра), таким образом, получая результат, который вы видите. (Точная версия << называется: ostream::operator<< (ostream& ( *pf )(ostream&)); - для получения дополнительной информации см. ссылку )

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

5 голосов
/ 28 марта 2012

std::ostream::operator<< перегружено для функциональных указателей типа ostream &(*)(ostream &).Поведение заключается в простом вызове функции для *this.

. Так работают такие вещи, как std::hex.

1 голос
/ 28 марта 2012

Существует существующая перегрузка operator<<, которая является членом basic_ostream

basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&));

Подпись соответствует вашей функции (а также std::endl, std::flush и т. Д.).

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