32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
|
||||||
1 | ||||||
Проблемы с понимаем перезагрузки операторов22.05.2012, 15:55. Показов 1603. Ответов 5
Метки нет (Все метки)
ни как не могу понять синтаксис перезагрузки операций. Просто жесть. Вот пример кодаЖ
friend ostream &operator<< (ostream &, const PhoneNumber &); Почему мы не пишем void, ведь она ничего не возвращает. friend void ostream &operator<< (ostream &, const PhoneNumber &); А вот это из разряда самого не понятного доя меня: friend ostream &operator<< (ostream &, const PhoneNumber &); Где родился тип ostream? зачем мы получаем на него ссылку.... Я предпологаю что это ссылка на функцию friend ostream &operator<<, но я очень плохо соображаю в ссылках на функцию и что это даёт... Почему когда я использую оператор << для обычного текста(cout << Rus("Введите номер телефона в виде (123) 456-7890:") ) у меня не срабатывает функция friend ostream &operator<<? Она вроде и не нужна там, но почему? Очень всё запутано, кто может пожалуйста обьясните, буду ооочень благодарен!!!
0
|
22.05.2012, 15:55 | |
Ответы с готовыми решениями:
5
Проблемы после перезагрузки трудность с понимаем кода на ВБ Проблемы после перезагрузки компа Проблемы с компом: глючит мышка и перезагрузки. |
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
22.05.2012, 16:02 | 2 |
friend ostream &operator<< (ostream &, const PhoneNumber &);
ostream & перед operator<<... это как раз и есть возвращаемый тип. т.е. эта дружественная функция, которая должна вернуть ссылку на ostream. friend ostream &operator<< (ostream &, const PhoneNumber &); это функция, которая возвращает ссылку на ostream, а в качестве аргументов принимает ссылку на ostream и константную ссылку на PhoneNumber. чтобы вызвать эту функцию ей нужно передать эти аргументы. ну а так как это оператор, то синтаксис вызова немного отличается от синтаксиса вызова обычных функций. запись std::cout << PhoneNumber(); это вызов такой функции, которой передается std::cout (std::ostream&), и PhoneNumber() (по константной ссылке) Чтобы увидеть что, она что-то возвращает, можно написать так: std::ostream& out = std::cout << PhoneNumber();
1
|
32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
|
|
22.05.2012, 18:40 [ТС] | 3 |
Спасибо! ostream что это за тип? я его не создавал следовательно он не пользовательский, чей он? И зачем нужен? можешьпожалуйста обьяснить схему работы всех этих операторов? что именно происходит при вызове <<?
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
24.05.2012, 12:15 | 4 | |||||
No10, раз вы его не создавали, но он есть, то можно было бы догадаться, что он библиотечный. Это базовый класс для всех потоков вывода.
Ваша проблема в том, что вы воспринимаете перегруженные операторы как нечто совершенно обособленное от всего остального. На самом деле это совершенно обычные функции с несколько необычным именем. И подчиняются тем же правилам, что и остальные функции. Единственное исключение - они должны принимать количество аргументов, равное количеству операндов оператора (при перегрузке в виде глобальной функции) или на единицу меньшее (при перегрузке в виде метода класса). Ну и хотя бы один из аргументов должен быть объектом какого-либо класса (т.е. нельзя перегрузить оператор сложения для двух интов). Из вашего оператора << теоретически можно было бы возвращать и void, но тогда нельзя было бы написать так:
1. Вызывается operator<<, принимающий std::cout и my_obj1 2. В результате этого вызова возвращается ссылка на поток, который был передан при вызове - на std::cout 3. Полученная ссылка снова передаётся во второй вызов operator<< в качестве первого аргумента, а my_obj2 - в качестве второго. Вот так каскадно и вызывается оператор << для каждого вывода. Если углубиться, то можно сказать, что компилятор при применении перегруженного оператора заменяет его вызов на явный вызов функции (метода). Т.е. если вы пишете my_obj1 + my_obj2, при этом перегрузив оператор +, принимающий в качестве аргументов объекты соответствующего класса, то компилятор подобный вызов заменит на operator+(my_obj1, my_obj2);
0
|
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 106
|
|
03.04.2013, 22:29 | 5 |
Дошел я в книге Дейтела до перегрузки операций и там был такой же код. Переписав его, я получил что при вводе
"(ххх) ххх-хххх", программа выводит только "(ххх) -". Как я понял у меня с 34 по 36 строчку ничего не выпоняется! Подскажите как исправить
0
|
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
|
|||||||||||
04.04.2013, 02:38 | 6 | ||||||||||
Или использовать istream& get (char* s, streamsize n);:
0
|
04.04.2013, 02:38 | |
04.04.2013, 02:38 | |
Помогаю со студенческими работами здесь
6
Проблемы с перегрузкой операторов файлового вводы/вывода Медленный интернет до перезагрузки ноутбука, а после перезагрузки быстрый Задача с использованием логических операторов и операторов ветвления Требуется разработать две программы (или одну с двумя циклами) с использованием операторов повтора (циклических операторов) WHILE и REPEAT Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |