Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
32 / 30 / 4
Регистрация: 03.06.2010
Сообщений: 465
1

Проблемы с понимаем перезагрузки операторов

22.05.2012, 15:55. Показов 1603. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ни как не могу понять синтаксис перезагрузки операций. Просто жесть. Вот пример кодаЖ

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <math.h>
 
using namespace std;
 
char bufRus[256];
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
 
class PhoneNumber{
        friend ostream &operator<< (ostream &, const PhoneNumber &);
        friend istream &operator>> (istream &, PhoneNumber &);
    private:
        char areaCode[4];
        char exchange[4];
        char line[5];
};
 
ostream &operator<< (ostream &output, const PhoneNumber &num)
{
    output << "(" << num.areaCode << ") " << num.exchange << "-" << num.line;
    return output;
}
 
istream &operator>> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areaCode, 4);
    input.ignore(2);
    input.getline(num.exchange, 4);
    input.ignore();
    input.getline(num.line, 5);
 
    return input;
}
 
int main()
{
    PhoneNumber phone;
    cout << Rus("Введите номер телефона в виде (123) 456-7890:") << endl;
    cin >> phone;
    cout << Rus("Был введён номер телефона ") << phone << endl;
    system("pause");
    return 0;
}
Почему мы не пишем тип возвращаемых данных в обьявлении дружественной функции:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2012, 15:55
Ответы с готовыми решениями:

Проблемы после перезагрузки
Здравствуйте. Следующая проблема с OpenSUSE. Установил систему. Через панель управления настроил...

трудность с понимаем кода на ВБ
есть статья http://www.rsdn.ru/article/inet/aspnet1.xml#EMIAE в Аутентификация формой с...

Проблемы после перезагрузки компа
всем привет...у меня возникла проблема... после перезагрузки, комп стал зависать...при входе в...

Проблемы с компом: глючит мышка и перезагрузки.
Всем доброго времени суток!На днях у меня возникла проблема, как сначала подумал с клавиатурой,...

5
DU
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, но тогда нельзя было бы написать так:
C++
1
std::cout << my_obj1 << my_obj2;
поскольку в результате выполнения первого вывода (т.е. применения оператора << к объектам std::cout и my_obj1) не остаётся объекта, который можно было бы передать в operator<< в качестве первого аргумента. Потому мы и возвращаем из него ссылку на поток, который был ему передан при вызове. Фактически указанный выше вывод выполняется в несколько этапов:
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
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
istream &operator>> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.getline(num.areaCode, 4);
    input.clear();
    input.ignore(2);
    input.getline(num.exchange, 4);
    input.clear();
    input.ignore();
    input.getline(num.line, 5);
    input.clear();
 
    return input;
}
Добавлено через 2 минуты
Или использовать istream& get (char* s, streamsize n);:
C++
1
2
3
4
5
6
7
8
9
10
11
istream &operator>> (istream &input, PhoneNumber &num)
{
    input.ignore();
    input.get(num.areaCode, 4);
    input.ignore(2);
    input.get(num.exchange, 4);
    input.ignore();
    input.get(num.line, 5);
    
    return input;
}
0
04.04.2013, 02:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 02:38
Помогаю со студенческими работами здесь

Проблемы с перегрузкой операторов файлового вводы/вывода
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace...

Медленный интернет до перезагрузки ноутбука, а после перезагрузки быстрый
Здравствуйте! Есть ноутбук MSI Windows 10, подключен дома к домашнему запароленному wi-fi. Проблема...

Задача с использованием логических операторов и операторов ветвления
Вот вам задачка, чтоб голову поломать :D Вася работает программистом и получает 50$ за каждые...

Требуется разработать две программы (или одну с двумя циклами) с использованием операторов повтора (циклических операторов) WHILE и REPEAT
расчитать \sum_{\propto }^{n=1}{-1}^{n}\frac{1}{n(2n+1)} c точностью \alpha 0,001 Нужно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru