И.В.Ашарина
Объектно-ориентированное
программирование в С++:
лекции и упражнения
Допущено УМО вузов по университетскому политехническому
образованию в качестве учебного пособия для студентов высших
учебных заведений, обучающихся по направлению подготовки
дипломированных специалистов 654600 (230100) – «Информатика и
вычислительная техника"
Москва
Горячая линия – Телеком
2012
УДК 681.3
ББК 32.97
А98
Р е ц е н з е н т : канд. техн. наук, доцент В. А. Мартынюк
А98
Ашарина И. В. <...> Пример 1.1:
# include <iostream>
using namespace std;
int main()
{ cout<<"Здравствуй, мир!\n";
return 0;
}
// директива препроцессора
// директива using
// начало программы
// оператор вывода на экран
Директива #include <iostream> подключает заголовочный файл
iostream, который обеспечивает работу с переменной cout и операцией <<
путем предоставления доступа к потокам ввода-вывода;
Глава 1. <...> Основные определения языка С++
7
using namespace std; обозначает, что используется пространство имен
с именем std. <...> Она необходима, чтобы избежать конфликтов идентификаторов;
main ( ) – имя основной программы, оно всегда присутствует и не
может изменяться;
{ } – скобки, ограничивающие тело программы;
cout<<«Здравствуй, мир!\n»; – оператор, выводящий на экран строку,
заключенную в кавычки;
return 0; – пока будем считать, что этот оператор необходим для корректного завершения программы. <...> Рассмотрим программу, содержащую элементы вычислений.
# include <iostream>
using namespace std;
int main()
{ int a, b, c;
// объявление трех переменных целого типа
a = 5; b = 10;
// определение переменных a и b
c = a+b;
// присваивание переменной c суммы a и b
cout<<"Значение с = "<<с<<'\n';
return 0;
}
В целом структура программы не изменилась, но добавились некоторые моменты:
int a,b,c; – объявление трех целочисленных переменных a, b и с; int –
признак того, что переменные имеют целый тип;
общим правилом при программировании на C++ является то, что
прежде, чем использовать в программе какую-либо переменную, ее необходимо объявить с указанием типа;
а=5, b=10; – определение <...>
Объектно-ориентированное_программирование_в_С++_лекции_и_упражнения.pdf
И.В.Ашарина
Объектно-ориентированное
программирование в С++:
лекции и упражнения
Допущено УМО вузов по университетскому политехническому
образованию в качестве учебного пособия для студентов высших
учебных заведений, обучающихся по направлению подготовки
дипломированных специалистов 654600 (230100) – «Информатика и
вычислительная техника"
Москва
Горячая линия – Телеком
2012
Стр.1
УДК 681.3
ББК 32.97
А98
Рецензент : канд. техн. наук, доцент В. А. Мартынюк
Ашарина И. В.
А98
Объектно-ориентированное программирование в С++: лекции
и упражнения.Учебное пособие для вузов.– М.: Горячая линия –
Телеком, 2012. – 320 c.: ил.
ISBN 978-5-9912-7001-4.
На доступном для начинающего программиста уровне изложены
концепция объектно-ориентированного программирования (ООП) и
сведения необходимые для быстрого освоения языка программирования
С++. Информация в книге расположена в порядке усложнения: от способов
написания простейших программ, имеющих линейную структуру,
до достаточно сложных, с использованием библиотеки STL. Большое
внимание уделено вопросам работы с функциями, которые являются
основой для перехода к ООП. Приведены многочисленные примеры,
контрольные вопросы и практические задания.
Для студентов, изучающих язык программирования С++, преподавателей
соответствующих специальностей и всех, кто хочет самостоятельно
освоить программирование на языке С++.
ББК 32.97
Адрес издательства в Интернет www.techbook.ru
Учебное электронное издание
Ашарина Ирина Владимировна
Объектно-ориентированное программирование в С++:
лекции и упражнения
Учебное пособие
Редактор А. Н. Иванов
Компьютерная верстка В. Н. Панкин
Обложка художника В. Г. Ситникова
Подписано в печать 14.09.07. Формат 6090/16. Печать офсетная
Уч.-изд. л. 20. Тираж 1000 экз. Изд. № 7285
ООО «Научно-техническое издательство «Горячая линия – Телеком»
ISBN 978-5-9912-7001-4
И. В. Ашарина, 2008, 2012
Оформление издательства «Горячая линияТелеком», 2008, 2012
Стр.2
ПРЕДИСЛОВИЕ
Язык С++ относится к классу универсальных языков, поскольку с его
помощью можно решить очень широкий круг задач, выполняемых на
ЭВМ. Среди современных алгоритмических языков язык С++ является,
пожалуй, одним из самых популярных и распространенных, но наиболее
эффективно его применение в написании системных программтрансляторов,
операционных систем, экранных интерфейсов, в обслуживании
инструментальных средств.
В большинстве случаев программы, выполненные на языке С++, по
быстродействию сравнимы с программами, написанными на Ассемблере.
С++ – язык высокого уровня, поэтому программы, подготовленные на
нем, более наглядны и просты в сопровождении.
Программы на языке С++ легко переносимы с одного типа компьютера
на другой.
Основные особенности языка С++ следующие:
•
•
в нем реализованы некоторые операции низкого уровня;
его базовые типы данных совпадают с типами данных языка Ассемблера;
•
несмотря на присутствие таких составных объектов, как массивы
и структуры, язык не допускает обращения с ними как с единым циклом;
•
широко использует указатели на переменные и функции;
• удобным средством для передачи параметров являются ссылки;
•
считается языком для профессионалов, поэтому многое «доверяет»
программисту: даже на такие важные действия, как преобразование
типов, налагаются лишь незначительные ограничения;
• несмотря на широкие возможности, невелик по объему за счет того,
что практически все выполняемые функции оформлены в виде подключаемых
библиотек.
Язык С служит базовой платформой для изучения языка С++. Эти
два языка имеют так много общих черт, что с методической точки зрения
оказывается целесообразным первые темы данного конспекта лекций посвятить
изучению языка С, а затем перейти к рассмотрению возможностей,
предоставляемых языком С++.
Язык С был разработан в США сотрудниками Bell Laboratories
Б. Керниганом и Д. Ритчи и использован для создания ОС UNIX. Во избежание
неоднозначных трактовок окончательный вариант был утвержден
в качестве стандарта ANSI C.
С++ обязан своим появлением сотруднику Bell Laboratories Б. Страуструппу.
Стр.3
4
Объектно-ориентированное программирование в С++
В книге приведены многочисленные и реально работающие примеры,
которые позволяют начинающим программистам взять за основу
программу из примера и, модифицируя ее, более качественно осваивать
язык программирования.
В конце каждой главы приведены контрольные вопросы. Большая
часть глав имеет также практические задания, что делает книгу интересной
для преподавателей, читающих курсы, связанные с программированием
на языках высокого уровня.
Книга предназначена для студентов и аспирантов, изучающих вопросы,
связанные с программированием, и преподавателей соответствующих
курсов.
Стр.4
ОГЛАВЛЕНИЕ
ВВЕДЕНИЕ .........................................................................................................3
ГЛАВА 1. ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ ЯЗЫКА С++.............................................5
1.1. Алфавит языка ......................................................................................5
1.2. Структура программы на языке С++ ..................................................6
ГЛАВА 2. СТАНДАРТНЫЕ ТИПЫ ДАННЫХ........................................................10
2.1. Переменные целого типа ...................................................................10
2.2. Переменные вещественного типа .....................................................11
2.3. Переменные логического типа..........................................................11
2.4. Константы ...........................................................................................11
2.5. Выражения ..........................................................................................12
2.6. Операции.............................................................................................13
2.7. Преобразование типов .......................................................................17
2.8. Манипулятор setw ..............................................................................18
ГЛАВА 3. ЛИНЕЙНЫЕ И РАЗВЕТВЛЕННЫЕ АЛГОРИТМЫ...................................20
3.1. Линейные алгоритмы.........................................................................20
3.2. Разветвленные алгоритмы .................................................................24
3.2.1. Условный оператор if..................................................................25
3.2.2. Оператор if – else .........................................................................26
3.2.3. Вложенные ветвления.................................................................27
3.2.4. Условная операция......................................................................28
3.2.5. Оператор множественного выбора ............................................29
ГЛАВА 4. ОРГАНИЗАЦИЯ ЦИКЛОВ В ЯЗЫКЕ С++............................................33
4.1. Оператор цикла с предварительным условием................................33
4.2. Оператор цикла с последующим условием......................................35
4.3. Оператор цикла с параметром...........................................................36
4.4. Оператор break....................................................................................39
4.5. Оператор continue...............................................................................39
4.6. Оператор goto......................................................................................41
4.7. Останов программы с помощью оператора exit ..............................41
4.8. Область видимости переменных внутри блока ...............................41
ГЛАВА 5. ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ ЦИКЛА
ДЛЯ РЕШЕНИЯ ПРИКЛАДНЫХ ЗАДАЧ................................................................44
5.1. Вычисление суммы бесконечного ряда с заданной точностью......44
5.2. Понятие о рекуррентных формулах..................................................45
5.3. Использование операторов цикла для решения задач
численными методами ..............................................................................46
Стр.313
314
Объектно-ориентированное программирование в С++
5.3.1. Вычисление с заданной точностью ε корня
уравнения F(x) = 0 методом простых итераций..................................46
5.3.2. Решение уравнения f(x) = 0 с заданной точностью ε
методом деления отрезка пополам ......................................................47
5.4. Использование операторов цикла для вычисления
определенных интегралов.........................................................................49
5.4.1. Вычисление значения ∫f(x)dx с заданной точностью
методом прямоугольников ...................................................................49
5.4.2. Вычисление
∫
b
a
ГЛАВА 6. МАССИВЫ И СТРОКИ .......................................................................54
6.1. Одномерные массивы.........................................................................54
6.2. Инициализация массива.....................................................................56
6.3. Методы сортировки массивов...........................................................57
6.3.1. Сортировка простым выбором...................................................57
6.3.2. Метод пузырьковой сортировки ................................................58
6.3.3. Метод пузырьковой сортировки с оптимизацией ....................59
6.4. Двумерные массивы...........................................................................61
6.5. Обработка матриц...............................................................................63
6.5.1. Работа с матрицей в целом.........................................................63
6.5.2. Работа со строками/столбцами матрицы...................................63
6.5.3. Диагональные элементы матриц................................................64
6.6. Строка как массив символов .............................................................66
6.6.1. Ввод и вывод строк .....................................................................66
6.6.2. Функции для работы со строками..............................................70
ГЛАВА 7. ТИПЫ ДАННЫХ, СОЗДАВАЕМЫЕ ПОЛЬЗОВАТЕЛЕМ (СТРУКТУРЫ,
ОБЪЕДИНЕНИЯ, ПЕРЕЧИСЛЕНИЯ).....................................................................73
7.1. Структуры ...........................................................................................73
7.1.1. Присваивание значений структурным переменным ................74
7.1.2. Псевдонимы структур.................................................................75
7.1.3. Операции, допустимые над переменными
структурного типа .................................................................................76
7.1.4. Вложенные структуры ................................................................76
7.1.5. Массивы структур .......................................................................77
7.1.6. Структуры с битовыми полями..................................................79
7.2. Объединения.......................................................................................79
7.3. Перечисления......................................................................................81
f(x)dx по формуле Симпсона...........................50
Стр.314
Оглавление
315
ГЛАВА 8. МАГНИТНЫЕ НОСИТЕЛИ ДАННЫХ.
ПОНЯТИЕ О ФАЙЛОВЫХ СИСТЕМАХ................................................................85
8.1. Структура диска..................................................................................85
8.2. Файловая система DOS. Таблица размещения файлов ..................86
8.3. Файловая система NTFS ....................................................................89
8.3.1. Структура раздела .......................................................................89
8.3.2. Структура MFT............................................................................90
8.3.3. Файлы и потоки ...........................................................................91
8.3.4. Каталоги .......................................................................................91
ГЛАВА 9. ОРГАНИЗАЦИЯ ВВОДА И ВЫВОДА. ФАЙЛОВАЯ СИСТЕМА...............93
9.1. Стандартные файлы ввода и вывода.................................................93
9.2. Текстовые файлы................................................................................94
9.3. Основные методы обработки текстовых файлов.............................95
9.4. Двоичные файлы.................................................................................98
9.5. Последовательный доступ к элементам
двоичных файлов.......................................................................................99
9.6. Организация произвольного доступа
к элементам двоичных файлов...............................................................102
9.7. Аргументы командной строки.........................................................104
ГЛАВА 10. ОБОБЩЕННАЯ АРХИТЕКТУРА ПРОЦЕССОРА IBM PC...................108
10.1. Понятие об адресном пространстве..............................................108
10.2. Система адресации в MS-DOS ......................................................109
10.3. Понятие о моделях памяти ............................................................110
ГЛАВА 11. ФУНКЦИИ В ЯЗЫКЕ С++ ..............................................................113
11.1. Объявление и определение функций............................................113
11.2. Понятие о параметрах функций ....................................................115
11.3. Локальные и глобальные переменные..........................................117
11.4. Отсутствие прототипов функций..................................................118
11.5. Строки, массивы и структуры в качестве
параметров функций ...............................................................................119
11.6. Рекурсия ..........................................................................................123
11.7. Встраиваемые функции..................................................................125
11.8. Перегрузка функций.......................................................................126
11.9. Использование аргументов по умолчанию ..................................127
ГЛАВА 12. ПОНЯТИЕ ОБ УКАЗАТЕЛЯХ И ССЫЛКАХ.
РЕЗЕРВИРОВАНИЕ ПАМЯТИ ...........................................................................131
12.1. Объявление указателей ..................................................................131
12.2. Разыменование указателей ............................................................132
Стр.315
316
Объектно-ориентированное программирование в С++
12.3. Нулевые указатели и указатели на тип void................................134
12.4. Ссылки.............................................................................................136
12.5. Резервирование памяти в куче ......................................................136
ГЛАВА 13. УКАЗАТЕЛИ И СТРУКТУРЫ ДАННЫХ............................................141
13.1. Указатели и массивы......................................................................141
13.2. Указатели и многомерные массивы..............................................145
13.3. Cтроковые указатели......................................................................147
13.4. Указатели и структуры...................................................................148
13.5. Указатели и модификатор const ....................................................150
ГЛАВА 14. УКАЗАТЕЛИ И ФУНКЦИИ.............................................................154
14.1. Способы передачи параметров......................................................154
14.2. Передача массивов посредством указателей................................155
14.3. Строки как аргументы функций....................................................156
14.4. Передача структур по указателю и по ссылке .............................157
14.5. Ссылка в качестве возвращаемого
значения функции....................................................................................158
14.6. Функции, возвращающие указатели.............................................159
14.7. Константные ссылки и константные указатели
в качестве параметров функций.............................................................160
14.8. Указатели на функции....................................................................162
ГЛАВА 15. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ .......................................165
15.1. Понятие о самоссылочных структурах.........................................165
15.2. Формирование очереди..................................................................165
15.3. Формирование стека.......................................................................168
15.4. Добавление и удаление элементов
в односвязных списках............................................................................170
15.5. Двусвязные списки.........................................................................173
15.6. Бинарные деревья...........................................................................176
ГЛАВА 16. ОСНОВНЫЕ ОПРЕДЕЛЕНИЯ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО
ПРОГРАММИРОВАНИЯ ...................................................................................180
ГЛАВА 17. СИСТЕМА ВВОДА-ВЫВОДА В С++ ...............................................186
17.1. Основные понятия..........................................................................186
17.2. Форматируемый ввод-вывод.........................................................186
17.3. Функции установки ширины поля, точности
и символа заполнения .............................................................................190
17.4. Манипуляторы ввода-вывода........................................................190
ГЛАВА 18. КОНСТРУКТОРЫ И ДЕСТРУКТОРЫ................................................192
18.1. Понятие о конструкторах и деструкторах....................................192
18.2. Конструкторы с параметрами........................................................193
18.3. Конструкторы по умолчанию........................................................194
Стр.316
Оглавление
317
18.4. Указатели на объекты ....................................................................195
18.5. Перегрузка конструкторов.............................................................196
18.6. Присваивание объектов .................................................................198
18.7. Конструктор копирования .............................................................199
ГЛАВА 19. ФУНКЦИИ И ОБЪЕКТЫ .................................................................203
19.1. Указатели на объекты ....................................................................203
19.2. Передача объектов в функции.......................................................204
19.2.1. Передача объектов по значению............................................204
19.2.2. Передача объектов по указателю...........................................205
19.2.3. Передача объектов по ссылке.................................................206
19.3. Объекты в качестве возвращаемых значений ..............................207
19.4. Дружественные функции...............................................................208
ГЛАВА 20. ПЕРЕГРУЗКА ОПЕРАТОРОВ...........................................................212
20.1. Перегрузка унарных операторов...................................................212
20.2. Перегрузка бинарных операторов.................................................214
20.3. Перегрузка операторов отношения
и логических операторов ........................................................................217
20.4. Перегрузка оператора индексирования ........................................218
20.5. Перегрузка оператора присваивания ............................................219
20.6. Перегрузка операторов управления памятью ..............................220
20.6.1. Перегрузка оператора new......................................................220
20.6.2. Перегрузка оператора delete ...................................................221
20.7. Использование дружественных оператор-функций....................223
20.8. Перегрузка операторов вставки и извлечения .............................225
20.9. Перегрузка оператора вызова функции........................................227
ГЛАВА 21. НАСЛЕДОВАНИЕ ..........................................................................229
21.1. Введение в наследование...............................................................229
21.2. Простое наследование....................................................................230
21.3. Режимы доступа к элементам базового класса............................230
21.4. Поведение конструкторов и деструкторов при наследовании ...234
21.5. Множественное наследование.......................................................236
21.5.1. Создание иерархии классов....................................................236
21.5.2. Прямое наследование нескольких
базовых классов...................................................................................237
ГЛАВА 22. ВИРТУАЛЬНЫЕ ФУНКЦИИ............................................................239
22.1. Понятие о виртуальных функциях................................................239
22.2. Указатели на базовый и производные классы .............................239
22.3. Виртуальные функции и наследование ........................................241
22.4. Абстрактные классы и чисто виртуальные функции .................242
22.5. Виртуальные деструкторы.............................................................244
22.6. Виртуальные базовые классы........................................................245
Стр.317