С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
M1kloFFi
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 27
#1

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

02.02.2014, 15:41. Просмотров 398. Ответов 3
Метки нет (Все метки)

Доброго времени суток.
Граждане программисты, подскажите пожалуйста как работает данный кусок кода???
А точнее дружественные функции 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 15:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как это работает? (C++):

Как это работает? Я хочу спросить как работает C++ и где можно про него почитать - C++
Привет, котоны. Заранее благодарю. Это будет моих общих вопросов нить, т.к. создавать целую ветку для каждого нецелесообразно. Я хочу...

Русификация.Работает-супер! Обьяснитте, как это работает? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; using namespace std; char* Rus(const char* text); int main () ...

Как это работает - C++
Здравствуйте уважаемые форумчане!Как это работает? Как например предотвратить выход за приделы допустимых значений переменных!? ...

Как это работает? - C++
Здравствуйте, можете, пожалуйста, поэтапно объяснить как работает приведенный ниже фрагмент кода? Что такое floor, return, ceil? double...

Как это работает? - C++
Читаю я кое какой &quot;учебник&quot;, и в нём появился такой вот кусок кода int input (tank&amp; t, char map) { char act; int ch; int e =...

Как это работает? - C++
#include &lt;iostream&gt; int *fun() { int a = 5; return &amp;a; } int main() { int *ptr = fun(); std::cout &lt;&lt;...

3
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 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;
}
1
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
02.02.2014, 15:49 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
M1kloFFi, Вы в программе свой перегружаете операторы ввода вывода. Они перегружаются не как члены класса, а как глобальные функции. А в классе эти функции объявляются дружественными(friend) нашему классу. это для того, чтобы из этого класса можно получать доступ к приватным полям класса.

C++
1
friend ostream& operator<<(ostream& s, employee& e);
По синтаксису перегруженный оператор вывода, например, принимает ссылку на поток вывода и ссылку на объект класса. Возвращает ссылку на поток вывода(почему видно из синтаксиса, напр cout << ....)
1
M1kloFFi
0 / 0 / 0
Регистрация: 14.10.2012
Сообщений: 27
02.02.2014, 15:52  [ТС] #4
Jupiter и kventin_zhuk огромное спасибо, разобрался!!!)
0
02.02.2014, 15:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2014, 15:52
Привет! Вот еще темы с ответами:

Как это работает? - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char* s=new char; ...

объясните как это работает - C++
#include &lt;iostream&gt; #include &lt;algorithm&gt; using namespace std; long func (long * arr, int length) { return...

Функция printf () как это работает - C++
Здраствуйте Ув. Форумчане. Прошу помочь разобраться с конкретным примером. #include &lt;iostream&gt; #include &lt;stdio.h&gt; float d = 1; ...

как все это в подробностях работает? - C++
#include &lt;iostream&gt; #include&lt;cstdlib&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;Russian&quot;); int i; int r; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.