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

Как это работает? - C++

Восстановить пароль Регистрация
 
M1kloFFi
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 23
02.02.2014, 15:41     Как это работает? #1
Доброго времени суток.
Граждане программисты, подскажите пожалуйста как работает данный кусок кода???
А точнее дружественные функции friend istream& operator>>(istream& s, employee& e) и friend ostream& operator<<(ostream& s, employee& e);

1)friend istream& operator>>(istream& s, employee& e) и friend ostream& - дружественная, перегруженная функция, которая возвращает значение класса istream&? Правильно ли я понял данную конструкцию?
2)Объясните пожалуйста зачем в "friend istream& operator>>(istream& s, employee& e)" - (istream& s)?
Если я правильно понял, то istream& дает возможность ввода данных?(если можно, объясните подробнее).
Заранее благодарен!)

Интересующий кусок кода:
Кликните здесь для просмотра всего текста

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
#include <iostream>
using namespace std;
 
const int LEN = 80;       // Максимальная длина имен
///////////////////////////////////////////////////////////
class employee            // класс employee
{
private:
    char name[LEN];       // имя работника
    unsigned long number; // номер работника
public:
    friend istream& operator>>(istream& s, employee& e);
    friend ostream& operator<<(ostream& s, employee& e);
};
//---------------------------------------------------------
istream& operator>>(istream& s, employee& e)
{
    cout << "\n  Введите фамилию: "; cin >> e.name;
    cout << "  Введите номер: ";    cin >> e.number;
    return s;
}
//---------------------------------------------------------
ostream& operator<<(ostream& s, employee& e)
{
    cout << "\n  Имя: " << e.name;
    cout << "\n  Номер: " << e.number;
    return s;
}

Вся программа(пример с книги)

Кликните здесь для просмотра всего текста

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
using namespace std;
 
const int LEN = 80;       // Максимальная длина имен
///////////////////////////////////////////////////////////
class employee            // класс employee
{
private:
    char name[LEN];       // имя работника
    unsigned long number; // номер работника
public:
    friend istream& operator>>(istream& s, employee& e);
    friend ostream& operator<<(ostream& s, employee& e);
};
//---------------------------------------------------------
istream& operator>>(istream& s, employee& e)
{
    cout << "\n  Введите фамилию: "; cin >> e.name;
    cout << "  Введите номер: ";    cin >> e.number;
    return s;
}
//---------------------------------------------------------
ostream& operator<<(ostream& s, employee& e)
{
    cout << "\n  Имя: " << e.name;
    cout << "\n  Номер: " << e.number;
    return s;
}
 
 
 
 
///////////////////////////////////////////////////////////
template<class TYPE>      // структура "link<TYPE>"
struct link               // один элемент списка
{
    TYPE data;            // элемент данных
    link* next;           // указатель на следующую ссылку
};
///////////////////////////////////////////////////////////
template<class TYPE>      // класс "linklist<TYPE>"
class linklist            // список ссылок
{
private:
    link<TYPE>* first;    // указатель на первую ссылку
public:
    linklist()            // конструктор без аргументов
    { first = NULL; }     // первой ссылки нет
    void additem(TYPE d); // добавить данные (одну ссылку)
    void display();       // показать все ссылки
};
//---------------------------------------------------------
template<class TYPE>
void linklist<TYPE>::additem(TYPE d)     // добавить данные
{
    link<TYPE>* newlink = new link<TYPE>;// создать новую ссылку
    newlink->data = d;                   // внести в нее данные
    newlink->next = first;               // указывающие на следующую ссылку
    first = newlink;                     // теперь первая ссылка указывает на эту
}
//---------------------------------------------------------
template<class TYPE>
void linklist<TYPE>::display()         // вывод всех ссылок
{
    link<TYPE>* current = first;       // установить указатель на
    // первую ссылку
    while(current != NULL)             // выйти после последней ссылки
    {
        cout << endl << current->data; // вывести данные
        current = current->next;       // перейти на следующую ссылку
    }
}
///////////////////////////////////////////////////////////
int main()
{
    setlocale(0,"");
    // lemp - объект класса
    linklist<employee> lemp;   // "linklist<employee>"
    employee emptemp;          // временное хранилище объектов
    char ans;                  // ответ пользователя ('y' или 'n')
 
    do
    {
        cin >> emptemp;        // получить данные от пользователя
        lemp.additem(emptemp); // добавить в emptemp
        cout << "\nПродолжать (y/n)? ";
        cin >> ans;
    } while(ans != 'n');       // при окончании ввода 
    lemp.display();            // вывести весь связный список
    cout << endl;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 15:41     Как это работает?
Посмотрите здесь:

C++ Как это работает
Как это работает? C++
C++ объясните как это работает
C++ Как это работает?
Как это работает? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
02.02.2014, 15:47     Как это работает? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от M1kloFFi Посмотреть сообщение
1)friend istream& operator>>(istream& s, employee& e) и friend ostream& - дружественная, перегруженная функция, которая возвращает значение класса istream&? Правильно ли я понял данную конструкцию?
да, только класс это istream, а & - это ссылка

Цитата Сообщение от M1kloFFi Посмотреть сообщение
2)Объясните пожалуйста зачем в "friend istream& operator>>(istream& s, employee& e)" - (istream& s)?
Если я правильно понял, то istream& дает возможность ввода данных?(если можно, объясните подробнее).
ваш пример кода:
Цитата Сообщение от M1kloFFi Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream& operator>>(istream& s, employee& e)
{
 cout << "\n *Введите фамилию: "; cin >> e.name;
 cout << " *Введите номер: "; * *cin >> e.number;
 return s;
}
//---------------------------------------------------------
ostream& operator<<(ostream& s, employee& e)
{
 cout << "\n *Имя: " << e.name;
 cout << "\n *Номер: " << e.number;
 return s;
}
не совсем правильный, правильнее так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
istream& operator>>(istream& s, employee& e)
{
 s >> e.name;
 s >> e.number;
 return s;
}
//---------------------------------------------------------
ostream& operator<<(ostream& s, employee& e)
{
 s << "\n *Имя: " << e.name;
 s << "\n *Номер: " << e.number;
 return s;
}
kventin_zhuk
БНТУ ФИТР
 Аватар для kventin_zhuk
214 / 154 / 15
Регистрация: 26.12.2012
Сообщений: 382
02.02.2014, 15:49     Как это работает? #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
M1kloFFi, Вы в программе свой перегружаете операторы ввода вывода. Они перегружаются не как члены класса, а как глобальные функции. А в классе эти функции объявляются дружественными(friend) нашему классу. это для того, чтобы из этого класса можно получать доступ к приватным полям класса.

C++
1
friend ostream& operator<<(ostream& s, employee& e);
По синтаксису перегруженный оператор вывода, например, принимает ссылку на поток вывода и ссылку на объект класса. Возвращает ссылку на поток вывода(почему видно из синтаксиса, напр cout << ....)
M1kloFFi
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 23
02.02.2014, 15:52  [ТС]     Как это работает? #4
Jupiter и kventin_zhuk огромное спасибо, разобрался!!!)
Yandex
Объявления
02.02.2014, 15:52     Как это работает?
Ответ Создать тему
Опции темы

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