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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
| #include <iostream.h>
// включение стандартного заголовочного файла, определенного стандартом.
// символ # обозначает начало директивы препроцессора
// include это директива препроцессора, включающая указанный в скобках файл в программу пользователя, то есть строчка #include <iostream.h> заменяется в исходном коде на содержимое файла iostream.h
// iostream.h это название файла, включаемого в программу
// скобки <> обозначают, что заголовочный файл предоставлен компилятором или каким-либо решением
// iostream это заголовочный файл языка C++ несовместимый с языком C
#include <stdlib.h>
// включение стандартного заголовочного файла stdlib.h, определенного стандартом.
// stdlib.h это заголовочный файл языка C
#include <conio.h>
// включение стандартного заголовочного файла conio.h, определенного стандартом.
// conio.h это заголовочный файл языка C
class B{
// объявление класса
// B это название класса
// Скобки { } заключают в себя объявление класса и должны заканчиваться ";" иначе компилятор выдаст сообщение об ошибке
int a;
// объявление переменной типа int, являющейся частью класса B
// модификатор доступа для переменной private ( по умолчанию), что означает, что вне класса получить или изменить значение переменной нельзя
// переменная int 4 байтовая, что накладывает ограничение на данные, которые могут храниться в переменной. Ограничения указаны в файле limits.h
// переменная int по умолчанию знаковая (signed)
// в компиляторе MS VC++ в переменной могут храниться значения от -2147483647 до 2147483647 ( константы INT_MIN и INT_MAX)
// 4 байта выделяются под хранение данных переменной
public:
// модификатор доступа для последующей части объявления класса public, что означает, что члены класса могут использоваться вне класса
B() { };
// особый метод: конструктор класса с пустым телом
B(int x) { a=x; }
// конструктор класса, принимающий в качестве параметра переменную типа int и устанавливающий переменную a класса в значение переменной, переданной в качестве параметра
void show_B() { cout <<"B= "<< a << "\n"; }
// функция выводит строку "B=", значение a и переход на новую строку в консоли
// void означает что функция не возвращает значений
// show_B - название метода класса
// () означают, что функция не принимает параметров
// cout это класс вывода языка C++ т.е объявлен как class cout
// << это перегруженный оператор класса cout
// "B= " это строка, "\n" это строка
};
// окончание объявления класса B. должно заканчиваться точкой с запятой.
class D1: public B {
// объявление класса
// D1 - класс-наследник от класса B
// { - начало тела класса
// переменные и методы класса B являются и переменными и методами класса D1
// public это модификатор доступа к классу B из класса D1, что означает что D1 может использовать переменные и методы класса B
// если доступ был бы private, то переменную a класса B класс D1 получить и использовать не мог бы
int b;
// объявление переменной типа int, являющейся частью класса D1
public:
// модификатор доступа
D1(int x, int y) : B(y) { b=x;};
// конструктор
// последовательность вызовов
// - конструктор класса B
// - выполнение инструкции b=x присваивающей значение переменной b
void show_D1() { cout <<"D1= "<< b << "\n"; show_B();}
// метод выводит переменную b и вызывает show_B осуществляющую вывод переменной a класса B
};
// окончание объявления класса
class D2: private B{
// объявление класса
// D2 - класс-наследник от класса B
// { - начало тела класса
// переменные и методы класса B являются и переменными и методами класса D2 если не объявлены как private, то есть переменную a класс D2 получить не может
int c;
// объявление переменной типа int, являющейся частью класса D2
public:
// модификатор доступа
D2(int x, int y) : B(y) { c=x;};
// конструктор
// последовательность вызовов
// - конструктор класса B
// - выполнение инструкции c=x; присваивающей значение переменной c
void show_D2() { cout <<"D2= "<< c << "\n"; show_B();}
// метод выводит переменную c и вызывает show_B осуществляющую вывод переменной a класса B
};
// окончание объявления класса D2
class D3: private B {
// объявление класса
// D3 - класс-наследник от класса B
// { - начало тела класса
// переменные и методы класса B являются и переменными и методами класса D3
int d;
// объявление переменной типа int, являющейся частью класса D2
public:
// модификатор доступа
D3(int x, int y) : B(y) { d=x;}
// конструктор
void show_D3() { cout << "D3= "<<d << "\n"; show_B();}
// метод вывода переменной d и вызов метода класса B show_B
};
// окончание объявления класса D3
class D4: private D1 {
// объявление класса
int e;
// объявление переменной типа int, являющейся частью класса D2
public:
// модификатор доступа
D4(int x, int y, int z) : D1(y,z) { e=x;}
// конструктор
// перед входом в тело конструктора вызываются конструктор класса D1
// который в свою очередь вызывает конструктор класса B
// после вызова конструктора класса D1 и соответствующего умеу вызову конструктора класса B выполняется инициализация переменной e члена класса
void show_D4() { cout <<"D4= "<< e << "\n"; show_D1();}
// метод вывода значения e и вызова функции show_D1
};
// окончание объявления класса D3
class D5: public D2, private D3 {
// объявление класса-наследника от D2 и D3 (множественное наследование)
int f;
// объявление переменной типа int, являющейся частью класса D2
public:
// модификатор доступа
D5(int x, int y, int z, int i, int j) : D2(y,z), D3(i,j) { f=x;}
// конструктор
// перед входом в тело конструктора вызываются конструкторы классов D2 и D3,
// которые в свою очередь вызывают конструктор класса B
// конструктор устаналивает значение переменной f в значение параметра x
void show_D5() { cout <<"D5= "<< f << "\n"; show_D2(); show_D3();}
// метод вывода переменной f и вызова функций show_D2 и show_D3, которые выводят переменные класса D2 и D3
};
// окончание объявления класса D5
main() {
// точка входа (entry point) в программу, с которой начинается ее выполнение. В регистр процессора EIP заносится указатель на адрес функции main в памяти и в регистр заносится адрес инструкции, которая будет выполнена при запуске приложения
clrscr();
// вызов функции, осуществляющей очистку экрана
D5 temp(100,200,300,400,500);
// создание экземпляра класса D5, вызов конструктора класса D5, принимающего 5 параметров,
// 1 параметр устанавливает значение переменной f класса D5,
// 2 и 3 параметр передаются конструктору класса D2 ,
// 4 и 5 переменные передаются конструктору класса D3
// последовательность вызовов конструкторов:
// - конструктор D2
// - конструктор B класса D2
// - конструктор D3
// - конструктор B класса D3
// - тело конструктора D5
cout << "D3 temp(100,200,300,400,500);\n";
// вывод строки на консоль
cout<< "\‘«Следуя иерархии класса* D5: \n";
// вывод строки на консоль
// символ \ означает, что последующий символ имеет значение, как часть строки
temp.show_D5();
// вывод переменных-членов классов
// оператор . указывает на вызов метода члена класса D5
getch();
// ожидания ввода пользователем программы символа с клавиатуры
return 0;
// функция main возвращает значение 0 вызвавшей программе
}
// окончание тела main |