УМК_ПрОА_3
.pdfДанные
Константы |
|
Переменные |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Статические типы данных |
Динамические типы данных |
Процедурные типы данных |
|||
|
|
|
|
|
|
Указатель Функция
|
|
|
|
|
Простые типы |
|
|
|
|
Структурированные типы |
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Целые |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Массив |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
unsigned |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Структура |
|
|
|
|
|||
|
|
|
|
|
|
int |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
long |
|
|
|
|
|
|
|
struct |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пустой |
|
|
|
|
|
|
|
Объединение |
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
void |
|
|
|
|
|
|
|
union |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Символьный |
|
|
|
|
|
|
|
Файл |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
char |
|
|
|
|
|
|
|
Класс |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Вещественные |
|
|
|
|
|
|
|
class |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Рис. 3.23 Классификация типов данных в языке С++ |
||||||||||||||
Таблица 3.35 Структурированные типы данных |
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тип |
|
Наимено- |
|
|
|
Назначение |
|
|
|
|
Синтаксис описания |
|||||||
|
|
|
|
|
|
вание |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Массив |
|
|
Содержит фиксированное |
|
int a[100] /*одномерный массив |
|||||||||||||||
|
|
|
|
|
|
|
количество |
|
|
|
|
/*целых чисел |
||||||||
|
|
|
|
|
|
|
упорядоченных |
|
float d[40][5] /*двумерный массив |
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
/*вещественных чисел |
|||||||||
|
|
|
|
|
|
|
однотипных элементов, |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
снабженных индексами. |
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
Бывает одномерным и |
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
многомерным. |
|
|
|
|
|
||||||||
Структу- |
|
struct |
Содержит фиксированное |
|
struct имя_структуры |
|||||||||||||||
ра |
|
|
число элементов разного |
|
{ |
|
|
|
||||||||||||
|
|
|
|
|
|
|
типа |
|
тип1 имя_элемента1; |
|||||||||||
|
|
|
|
|
|
|
|
... |
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TипN имя_элементаN; |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}имя_переменной_типа_структуры; |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ПРИМЕР |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct date |
169
|
|
|
{ |
|
|
|
|
int day; |
|
|
|
|
char month[9]; |
|
|
|
|
int year; |
|
|
|
|
}d; |
|
Объедин |
union |
Подобно структуре, но в |
union имя_объединения |
|
ение |
|
каждый момент времени |
{ |
|
|
|
хранит значение только |
тип1 имя_элемента1; |
|
|
|
... |
|
|
|
|
одного элемента |
|
|
|
|
TипN имя_элементаN; |
||
|
|
|
}имя_переменной_типа_объединения; |
|
|
|
|
ПРИМЕР |
|
|
|
|
union time |
|
|
|
|
{ |
|
|
|
|
int hour; |
|
|
|
|
long second; |
|
|
|
|
}t; |
|
Файл |
out_file |
Последовательность |
#include<fstream.h> |
|
|
in_file |
элементов одного типа, |
ofstream out_file |
|
|
расположенных на |
("имя_файла.расширение"); //открытие |
||
|
|
внешнем устройстве. |
файла в режиме создания и вывода данных в |
|
|
|
него |
||
|
|
Число элементов в файле |
||
|
|
не объявляется. |
ifstream in_file |
|
|
|
|
||
|
|
|
("имя_файла.расширение"); |
|
|
|
|
// открытие файла в режиме ввода данных из |
|
|
|
|
него |
|
Класс |
class |
Структура, содержащая |
class имя_класса |
|
|
|
описание данных и |
{ |
|
|
|
функций |
тип1 имя_элемента1; |
|
|
|
типN имя_элементаN; |
||
|
|
|
||
|
|
|
описание_функции1; |
|
|
|
|
описание_функцииN; |
|
|
|
|
} |
|
|
|
|
ПРИМЕР |
|
|
|
|
class date |
|
|
|
|
{ |
|
|
|
|
public: char name[64]; |
|
|
|
|
int day; |
|
|
|
|
char month[9]; |
|
|
|
|
int year; |
|
|
|
|
void show_birthday(void); //прототип |
|
|
|
|
функции |
|
|
|
|
}; |
|
Таблица 3.36 Процедурные типы данных |
|
|
||
|
|
|
|
|
Тип |
Наимено- |
Назначение |
Синтаксис описания |
|
|
вание |
|
|
|
Функция |
|
Предназначена для |
void main(void) /*начало главной |
|
|
|
выполнения действий и |
/*функции |
|
|
|
/или вычисления |
float name (float x, float y) |
|
|
|
параметра. |
|
|
|
|
/*описание функции с параметрами |
|
Операторы языка С++ представлены на рис. 3.24
170
Операторы
Простые
(не содержат других операторов)
Структурированные
(состоят из других операторов)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Оператор присваивания |
|
|
|
|
Условный оператор IF |
|
|||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Обращение ввода-вывода |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Оператор варианта CASE |
|
||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Оператор безусловного перехода |
|
|
|
|
Оператор цикла-ПОКА WHILE |
|
|||
|
|
|
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Оператор цикла-ДО DO WHILE |
|
||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
Оператор цикла с параметром FOR |
|
||
|
|
|
|
|
|
|
|
||||
|
|
Рис. 3.24 Операторы управления последовательностью выполнения программы |
|||||||||
Таблица 3.37 Арифметические операции |
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Знак |
Операция |
|
Знак |
|
Операция |
|||||
+ |
Сложение |
|
. |
|
|
Оператор выбора элемента |
|||||
- |
Вычитание |
|
:: |
|
|
Разрешение области видимости |
|||||
* |
Умножение |
|
++ |
|
|
Приращение |
|||||
/ |
Деление |
|
-- |
|
|
Уменьшение |
|||||
= |
Присваивание |
|
* |
|
|
Указатель на элемент |
Таблица 3.38 Операции отношения
|
Знак |
|
|
Операция отношения |
|
|
|
= = |
|
Равно |
|
|
|
|
!= |
|
Не равно |
|
|
|
|
>= |
|
Больше или равно |
|
||
|
< |
|
Меньше |
|
|
|
|
<= |
|
Меньше или равно |
|
||
|
|| |
|
Логическое ИЛИ |
|
||
|
&& |
|
Логическое И |
|
|
|
|
?: |
|
Условный оператор сравнения. |
|
||
Таблица 3.39 Простые операторы |
|
|
|
|||
|
|
|
|
|
|
|
Оператор |
Наимено- |
Назначение |
|
Синтаксис описания |
|
|
|
вание |
|
|
|
|
|
Присваива |
|
Записывает значение |
|
имя_переменной=выражение; |
|
|
ния |
|
вычисленного выражения в |
|
ПРИМЕР |
|
|
|
|
именованную ячейку памяти |
|
F=3*c+2*sin(x); |
|
|
Переход |
goto |
Программа переходит на |
|
goto метка; |
|
|
|
|
выполнение операторов, |
|
ПРИМЕР |
|
|
|
|
следующих за помеченным |
|
include <iostream.h> |
|
171
|
|
|
|
меткой |
void main(void) |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
float a,b; |
|
|
|
|
|
|
b=5; |
|
|
|
|
|
|
goto ml; |
|
|
|
|
|
|
... |
|
|
|
|
|
|
ml: a=b*3; |
|
|
|
|
|
|
... |
|
|
|
|
|
|
} |
|
|
Ввод |
сin>> |
Операция извлекает данные |
#include <iostream.h> |
||
|
данных из |
|
|
из входного потока, |
cin>>xl>>...>>xN; |
|
|
входного |
|
|
присваивая значение |
|
|
|
потока в |
|
|
указанным переменным |
|
|
|
память |
|
|
|
|
|
|
Вывод |
cout<< |
Операция вставляет данные |
#include <iostream.h> |
||
|
данных из |
|
|
в выходной поток |
cout<<xl<<...<<xN; |
|
|
памяти в |
|
|
|
|
|
|
выходной |
|
|
|
|
|
|
поток |
|
|
|
|
|
|
Таблица 3.40 Специальные символы, используемые с оператором cout |
|||||
|
|
|
|
|
|
|
|
Символ |
|
Назначение |
|
|
|
|
\а |
|
Звуковой сигнал динамика |
|
|
|
|
\b |
|
Символ возврата |
|
|
|
|
\f |
|
Символ перевода страницы |
|
|
|
|
\n |
|
Символ новой строки |
|
|
|
|
\r |
|
Возврат каретки |
|
|
|
|
\t |
|
Символ горизонтальной табуляции |
|
||
|
\v |
|
Символ вертикальной табуляции |
|
|
|
|
\\ |
|
Символ обратный слеш |
|
|
|
|
\? |
|
Знак вопроса |
|
|
|
|
\' |
|
Одинарные кавычки |
|
|
|
|
\" |
|
Двойные кавычки |
|
|
|
|
\0 |
|
Нулевой символ |
|
|
|
|
Таблица 3.41 Структурированные операторы |
|
|
|||
|
|
|
|
|
||
|
Оператор |
Наимено- |
Назначение |
Синтаксис описания |
||
|
|
вание |
|
|
|
|
|
Условный |
if |
Реализует алгоритмическую |
if (условие) оператор1; else |
||
|
|
|
|
конструкцию РАЗВИЛКА и |
оператор2; |
|
|
|
|
|
изменяет порядок |
ПРИМЕР |
|
|
|
|
|
#include <iostream.h> |
||
|
|
|
|
выполнения операторов в |
||
|
|
|
|
void main(void) |
||
|
|
|
|
зависимости от истинности |
{ |
|
|
|
|
|
или ложности некоторого |
float a,b,rl,r2; |
|
|
|
|
|
условия |
cin>>a>>b; |
|
|
|
|
|
|
cout<<"a="<<a<<" b="<<b<<endl |
|
|
|
|
|
|
; |
|
|
|
|
|
|
if (a>b) {rl=a;r2=b;} else |
|
|
|
|
|
|
{rl=b;r2=a} |
|
|
|
|
|
|
cout<<"большее |
|
|
|
|
|
|
число="<<r1<<"меньшее |
|
|
|
|
|
|
число="<<r2; |
|
|
|
|
|
|
} |
|
|
Вариант |
switch |
Реализует выбор варианта из |
switch (выражение) |
||
|
|
|
|
|
{ |
|
172
|
|
любого количества |
|
case i:оператор1; break; |
||
|
|
вариантов |
|
|
case j:oпepaтop2; breaks- |
|
|
|
|
|
|
|
case k:oпepaтopK; break; |
|
|
|
|
|
|
default:oпepaтopN; break; |
|
|
|
|
|
|
} |
Оператор |
while |
Организует |
выполнение |
while(условие) |
||
цикл- |
|
одного |
|
|
оператора |
оператор; |
ПОКА |
|
неизвестное |
заранее число |
|
||
|
|
раз. |
|
|
|
|
|
|
Выход – ложность |
|
|
||
|
|
логического выражения, |
|
|||
|
|
которое проверяется в |
|
|||
|
|
начале каждой итерации. |
|
|||
|
|
Тело цикла может не |
|
|||
|
|
выполняться ни разу. |
|
|||
Оператор |
do |
Выполнение |
|
цикла, |
do {операторы;} |
|
цикл-ДО |
while |
состоящего из любого числа |
while(условие); |
|||
|
|
операторов, |
с неизвестным |
|
||
|
|
заранее числом повторений. |
|
|||
|
|
Тело |
цикла |
выполняется |
|
|
|
|
хотя бы один раз. Выход – |
|
|||
|
|
при истинности логического |
|
|||
|
|
выражения |
|
|
|
|
Оператор |
for |
Организует |
выполнение |
for (i=iн;i<=iк; i=i+Δi) |
||
цикла c |
|
одного |
оператора |
(простого |
оператор; |
|
парамет- |
|
или |
составного) |
заранее |
|
|
ром |
|
известное число раз. |
|
Объектно-ориентированная терминология языка С++
Понятие класса
Класс (class) – это структура, содержащая описания данных функций.
Функции класса называют методами класса.
class имя_класса
{
тип1 имя_элемента1; типN имя_элементаN; описание_функции1; описание_функцииN;
}
Объект является представителем класса и объявляется после определения класса следующим образом:
имя_класса имя_объекта1,..., имя_объектаN;
Пример:
class date
{
public: char name[64]; int day;
173
char month[9]; int year;
void show_birthday(void) //прототип функции };
void main(void)
{
date father, mother, daughter; //объявление объектов класса date
...
}
Понятие инкапсуляции Инкапсуляция – это сокрытие некоторых данных, входящих в класс,
путем объявления их частными (private). В отличие от общих (public)
элементов класса, к которым можно обратиться из любого места программы,
используя оператор-точку, к частным элементам можно обратиться только через функции (методы) класса.
Пример. Работа с классом
class zp // описание класса
{
private: //объявление частных элементов char name[64];
float sal;
public: //объявление общих элементов
void in_dat(char *,float); //прототипы функций void show_sal(void) ;
float change_sal(float);
}
void zp::in_dat(char *new_name,float old_sal) //описание функций
{
…
}
zp father; //объявление объекта father класса zp
Конструкторы и деструкторы объектов класса
Конструктор предназначен для присваивания исходных данных конкретному объекту данного класса. Конструктор носит имя класса и описывается как обычная функция (метод) класса. После описания конструктора в программе в операторе объявления объекта допускается присваивание начальных значений.
Деструктор – это специальная функция без параметров,
174
обеспечивающая уничтожение объекта в процессе выполнения программы.
Деструктор носит имя класса, начинающееся с символа тильда (~), и
описывается в программе как обычная функция (метод) класса. Применение деструкторов целесообразно при создании динамических списков, которые увеличиваются или уменьшаются в процессе выполнения программы.
Пример. class zp
{
private:
char name[64] ; float sal;
public:
zp(char *,float); //конструктор ~zp(void); //деструктор
void show sal(void);
};
zp::zp(char *new_name,float old_sal) //описание конструктора
{
...;
}
zp::~zp(void); //описание деструктора
{
...
}
void main(void)
{
zp father("Иванов H.M.",2000) ; //инициализация объекта father
...
}
Перегрузка операторов Перегрузка операторов заключается в изменении смысла действия
операторов при работе их с определенными классами. Например, в
некотором классе можно описать функцию сложения двух символьных строк, которую компилятор C++ будет вызывать из этого класса для выполнения соответствующей операции. Если в программе используются,
кроме того, операции сложения переменных типа int или float, то над ними будет выполнена стандартная операция сложения. Другими словами,
смысл оператора сложения изменится только для элементов указанного класса.
Для перегрузки операторов в прототипе и в заголовке функции
175
(метода) класса используется ключевое слово operator, после которого
указывается символ перегружаемого оператора.
Пример. |
|
class sum |
|
{ |
|
private: |
|
char word[256] ; |
|
public: |
//конструктор |
sum(char *); |
void operator +(char *); //перегружаемый оператор (+) void show_sum(void);
};
sum::sum(char *line) //описание конструктора
{ |
|
... |
|
} |
/*описание перегружаемого |
void sum::operator +(char *line) |
|
{ |
/*оператора |
... |
|
} |
|
void main(void) |
|
{ |
|
sum statement("C++") ; //инициализация объекта statement statement + " - удобный язык!";
}
Наследование и полиморфизм Наследование – это возможность использования элементов класса,
созданного для одной программы, в другой программе. Исходный класс называется базовым (родительским), построенный из ранее созданного класса называется производным.
Под простым наследованием понимается процесс создания одного производного класса, наследующего элементы базового класса.
Для создания производного класса нужно указать ключевое слово class, имя производного класса, двоеточие, режим доступа к элементам базового класса и имя базового класса. После этого надо определить элементы нового, производного класса.
Пример. Простое наследование
class zp |
//описание базового класса |
{ |
|
private: |
|
char name[64]; |
|
176
float sal; public:
zp(char *,float); void show_sal(void) ;
};
class zpp:public zp //описание производного класса
{
private: //определение элементов float prize;
public:
zpp(char *,float,float); void show_sal(void);
};
Множественное наследование
Под множественным наследованием понимается процесс создания производного класса из нескольких ранее созданных базовых классов.
class date |
//описание базового класса date |
{ |
|
private: |
|
char name[64]; |
|
char dat_birth[64]; |
|
public: |
|
date(char *,char *); |
|
void show_birth(void); |
|
};
class zp //описание базового класса zp
{
private:
float sal; public:
zp(float);
void show_sal (void);
};
При определении производного класса нужно указать ключевое слово class, имя производного класса, двоеточие, перечислить через запятую режимы доступа и имена базовых классов, а затем объявить элементы производного класса:
class date_sal:public date,puplic zp // описание производного
{ |
класса |
private: |
/*описание элементов |
float prize; |
/* производного класса |
public: |
|
date_sal(char *,char *,float,float);
177
void show_date_sal(void) ;
};
Понятие о полиморфизме и виртуальных функциях
Полиморфизм – это способность объекта изменять форму (поли – много, морфизм – изменение формы), возможность использовать одинаковые имена для методов, входящих в различные классы. Перегрузка функций и перегрузка операторов – это проявление полиморфизма во время компиляции программы на языке C++.
Полиморфизм во время выполнения программы обеспечивается использованием виртуальных функций базовых классов и применением указателей на объекты базовых классов. Для создания полиморфного объекта первоначально определяются виртуальные функции базовых классов при помощи ключевого слова virtual, размещаемого перед прототипами функций. В зависимости от того, на объект какого класса будет указывать указатель, определяется, какая виртуальная функция будет вызвана во время выполнения программы.
Создание указателя на объект базового класса выполняется в программе следующим образом:
Имя_базового_класса *указатель;
Для того чтобы изменить форму объекта, указателю присваивается адрес объекта производного класса:
указатель=(имя_базового_класса *)&имя_объекта_производного_класса;
Кроме перечисленных выше, в языке C++ существует еще один способ реализации полиморфизма – использование шаблонов функций и шаблонов классов.
Шаблон функции позволяет определить функции, возвращающие значения разных типов. Например, шаблон функции sqr, возвращающей значение переменной х, возведенное в квадрат, выглядит так:
178