Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Об авторе . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Для кого эта книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Как построена книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Условные обозначения, используемые в книге . . . . . . . . . . . . . . . . . . 25
Исходный код к книге . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Несколько слов о компиляторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Глава 1. Типы, переменные, стандартный
ввод-вывод. Игра «Утраченный клад» . . . . . . . . . . . . . . . . 29
Введение в C++............................................ 29
Использование языка C++ при программировании игр . . . . . . . . . 30
Создание исполняемого файла . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Исправление ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Понятие о стандарте ISO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Пишем первую программу на C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Знакомство с программой Game Over . . . . . . . . . . . . . . . . . . . . . . 33
Комментирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Использование пробелов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Включение других файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Определение функции main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Отображение текста в стандартном выводе . . . . . . . . . . . . . . . . . 36
Завершение инструкций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Возвращение значения от функции main() . . . . . . . . . . . . . . . . . . 37
Работа с пространством имен std . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Знакомство с программой Game Over 2.0 . . . . . . . . . . . . . . . . . . . . 38
Использование директивы using . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Знакомство с программой Game Over 3.0 . . . . . . . . . . . . . . . . . . . . 38
Использование объявлений using . . . . . . . . . . . . . . . . . . . . . . . . . 39
Когда следует использовать using . . . . . . . . . . . . . . . . . . . . . . . . . 39
Работа с арифметическими операторами . . . . . . . . . . . . . . . . . . . . . . . . . 39
Знакомство с программой Expensive Calculator . . . . . . . . . . . . . . . . 40
Сложение, вычитание, умножение . . . . . . . . . . . . . . . . . . . . . . . . 40
Понятие о делении без остатка и делении с плавающей
запятой . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Работа с оператором деления по модулю . . . . . . . . . . . . . . . . . . . 41
Понятие о последовательности операций . . . . . . . . . . . . . . . . . . . 41
Объявление и инициализация переменных . . . . . . . . . . . . . . . . . . . . . . . . 42
Знакомство с программой Game Stats . . . . . . . . . . . . . . . . . . . . . . 42
Понятие о примитивах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Понятие о модификаторах типов . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Объявление переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Именование переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Присваивание значений переменным . . . . . . . . . . . . . . . . . . . . . . 46
Инициализация переменных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Отображение значений переменных . . . . . . . . . . . . . . . . . . . . . . . 47
Получение пользовательского ввода . . . . . . . . . . . . . . . . . . . . . . . 48
Определение новых имен для типов . . . . . . . . . . . . . . . . . . . . . . . 48
Типы, которые следует использовать . . . . . . . . . . . . . . . . . . . . . . 48
Выполнение арифметических операций с применением переменных . . . . 49
Знакомство с программой Game Stats 2.0 . . . . . . . . . . . . . . . . . . . 49
Изменение значения переменной . . . . . . . . . . . . . . . . . . . . . . . . . 50
Использование комбинированных операторов присваивания . . . . . 50
Использование операторов инкремента и декремента . . . . . . . . . . 51
Что делать с целочисленным переполнением . . . . . . . . . . . . . . . . 52
Работа с константами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Знакомство с программой Game Stats 3.0 . . . . . . . . . . . . . . . . . . . 53
Использование констант . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Работа с перечислениями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Игра «Утраченный клад» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Настройка параметров программы . . . . . . . . . . . . . . . . . . . . . . . . 56
Получение информации от игрока . . . . . . . . . . . . . . . . . . . . . . . . 57
Сюжет . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Глава 2. Истина, ветвление и игровой цикл. Игра «Угадай
число» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Понятие об истине . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
Использование инструкции if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Знакомство с программой Score Rater . . . . . . . . . . . . . . . . . . . . . . 63
Проверка условий true и false . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Интерпретация значения как истинного или ложного . . . . . . . . . . 65
Работа с реляционными операторами . . . . . . . . . . . . . . . . . . . . . . 66
Вложение инструкций if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Работа с условием else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Знакомство с программой Score Rater 2.0 . . . . . . . . . . . . . . . . . . . 67
Создание двух способов ветвления . . . . . . . . . . . . . . . . . . . . . . . . 69
Использование последовательности инструкций с помощью условий else . . 69
Знакомство с программой Score Rater 3.0 . . . . . . . . . . . . . . . . . . . 70
Создание последовательности инструкций if с применением
условий else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Использование инструкции switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Знакомство с программой Menu Chooser . . . . . . . . . . . . . . . . . . . . 72
Создание нескольких вариантов ветвления . . . . . . . . . . . . . . . . . . 74
Использование циклов while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Знакомство с программой Play Again . . . . . . . . . . . . . . . . . . . . . . . 74
Работа с циклом while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Использование циклов do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
Знакомство с программой Play Again 2.0 . . . . . . . . . . . . . . . . . . . . 76
Работа с циклом do . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Использование инструкций break и continue . . . . . . . . . . . . . . . . . . . . . . . 77
Знакомство с программой Finicky Counter . . . . . . . . . . . . . . . . . . . 78
Создание цикла while (true) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Использование инструкции break для выхода из цикла . . . . . . . . . 79
Использование инструкции continue для перехода
в начало цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Когда следует использовать инструкции break и continue . . . . . . . 80
Использование логических операторов . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Знакомство с программой Designers Network . . . . . . . . . . . . . . . . . 80
Использование логического оператора «И» . . . . . . . . . . . . . . . . . . 82
Использование логического оператора «ИЛИ» . . . . . . . . . . . . . . . 83
Использование логического оператора «НЕ» . . . . . . . . . . . . . . . . . 84
Понятие о порядке операций . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Генерирование случайных чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Знакомство с программой Die Roller . . . . . . . . . . . . . . . . . . . . . . . . 85
Вызов функции rand() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Посев генератора случайных чисел . . . . . . . . . . . . . . . . . . . . . . . . 87
Расчет числа в заданном диапазоне . . . . . . . . . . . . . . . . . . . . . . . 88
Понятие об игровом цикле . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Знакомство с игрой Guess My Number . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Применение игрового цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Установка игровых параметров . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Создание игрового цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Завершение игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
Глава 3. Циклы for, строки и массивы. Игра «Словомеска» . . . . . . 97
Использование циклов for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Знакомство с программой Counter . . . . . . . . . . . . . . . . . . . . . . . . . 98
Подсчеты с помощью циклов for . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Использование пустых инструкций в циклах for . . . . . . . . . . . . . . 100
Вложение циклов for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Понятие об объектах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Работа со строковыми объектами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Знакомство с программой String Tester . . . . . . . . . . . . . . . . . . . . 104
Создание строковых объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Конкатенация строковых объектов . . . . . . . . . . . . . . . . . . . . . . . 106
Использование функции-члена size() . . . . . . . . . . . . . . . . . . . . . 106
Индексация объекта string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Перебор символов в объектах String . . . . . . . . . . . . . . . . . . . . . . 107
Использование функции-члена find() . . . . . . . . . . . . . . . . . . . . . 108
Использование функции-члена erase() . . . . . . . . . . . . . . . . . . . . 108
Использование функции-члена empty() . . . . . . . . . . . . . . . . . . . . 109
Работа с массивами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Знакомство с программой Hero's Inventory . . . . . . . . . . . . . . . . . . 109
Создание массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Индексация массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Обращение к функциям-членам элемента массива . . . . . . . . . . . 113
Следите за границами массива . . . . . . . . . . . . . . . . . . . . . . . . . . 113
Си-строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Использование многомерных массивов . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Знакомство с программой Tic-Tac-Toe Board . . . . . . . . . . . . . . . . . 115
Создание многомерных массивов . . . . . . . . . . . . . . . . . . . . . . . . 116
Индексация многомерных массивов . . . . . . . . . . . . . . . . . . . . . . 117
Знакомство с игрой «Словомеска» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Приступаем к разработке программы . . . . . . . . . . . . . . . . . . . . . 118
Выбор слова для перемешивания . . . . . . . . . . . . . . . . . . . . . . . . 118
Перемешивание слова . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Приглашение игрока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Начало игрового цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
Прощание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Глава 4. Библиотека стандартных шаблонов. Игра
«Виселица» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Знакомство с библиотекой стандартных шаблонов . . . . . . . . . . . . . . . . . 125
Работа с векторами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Знакомство с программой Hero’s Inventory 2.0 . . . . . . . . . . . . . . . 127
Подготовка к работе с векторами . . . . . . . . . . . . . . . . . . . . . . . . 128
Объявление вектора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Работа с функцией-членом push_back( ) . . . . . . . . . . . . . . . . . . . 129
Работа с функцией-членом size() . . . . . . . . . . . . . . . . . . . . . . . . . 129
Индексация векторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Вызов функций-членов элемента . . . . . . . . . . . . . . . . . . . . . . . . 130
Использование функции-члена pop_back() . . . . . . . . . . . . . . . . . 130
Использование функции-члена clear() . . . . . . . . . . . . . . . . . . . . . 131
Использование функции-члена empty() . . . . . . . . . . . . . . . . . . . . 131
Работа с итераторами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Знакомство с программой Hero’s Inventory 3.0 . . . . . . . . . . . . . . . 131
Объявление итераторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Перебор содержимого вектора . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Изменение значения элемента вектора . . . . . . . . . . . . . . . . . . . . 136
Доступ к функциям-членам элемента вектора . . . . . . . . . . . . . . . 136
Использование векторной функции-члена insert() . . . . . . . . . . . . 137
Использование векторной функции-члена erase() . . . . . . . . . . . . 138
Использование алгоритмов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Знакомство с программой High Scores . . . . . . . . . . . . . . . . . . . . . 138
Подготовка к использованию алгоритмов . . . . . . . . . . . . . . . . . . 140
Использование алгоритма find() . . . . . . . . . . . . . . . . . . . . . . . . . 140
Использование алгоритма random_shuffle() . . . . . . . . . . . . . . . . . 141
Использование алгоритма sort() . . . . . . . . . . . . . . . . . . . . . . . . . 141
Понятие о производительности векторов . . . . . . . . . . . . . . . . . . . . . . . . 142
Подробнее о росте векторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Подробнее о вставке и удалении элементов . . . . . . . . . . . . . . . . 144
Исследование других контейнеров библиотеки STL . . . . . . . . . . . . . . . . 144
Планирование программ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Использование псевдокода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Пошаговое усовершенствование программы . . . . . . . . . . . . . . . . 146
Знакомство с программой «Виселица» . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Планирование игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Подготовка программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Инициализация переменных и констант . . . . . . . . . . . . . . . . . . . 148
Начало основного цикла . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Получение вариантов от пользователя . . . . . . . . . . . . . . . . . . . . 149
Конец игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Глава 5. Функции. Игра «Безумные библиотекари» . . . . . . . . . . . 154
Создание функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Знакомство с программой Instructions . . . . . . . . . . . . . . . . . . . . . 154
Объявление функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Определение функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Вызов функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Понятие об абстрагировании . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Использование параметров и возвращаемых значений . . . . . . . . . . . . . . 157
Знакомство с программой Yes or No . . . . . . . . . . . . . . . . . . . . . . . 158
Возврат значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Запись значений в параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Понятие об инкапсуляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Понятие о переиспользовании ПО . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Работа с областями видимости . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Знакомство с программой Scoping . . . . . . . . . . . . . . . . . . . . . . . . 163
Работа с отдельными областями видимости . . . . . . . . . . . . . . . . 164
Работа с вложенными областями видимости . . . . . . . . . . . . . . . . 165
Использование глобальных переменных . . . . . . . . . . . . . . . . . . . . . . . . 166
Знакомство с программой Global Reach . . . . . . . . . . . . . . . . . . . . 167
Объявление глобальных переменных . . . . . . . . . . . . . . . . . . . . . 168
Доступ к глобальным переменным . . . . . . . . . . . . . . . . . . . . . . . 168
Скрывание глобальных переменных . . . . . . . . . . . . . . . . . . . . . . 168
Изменение глобальных переменных . . . . . . . . . . . . . . . . . . . . . . 169
Минимизация использования глобальных переменных . . . . . . . . 169
Использование глобальных констант . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Использование аргументов, задаваемых по умолчанию . . . . . . . . . . . . . 170
Знакомство с программой Give Me a Number . . . . . . . . . . . . . . . . 171
Задание аргументов, применяемых по умолчанию . . . . . . . . . . . . 172
Присваивание параметрам аргументов, задаваемых
по умолчанию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Переопределение аргументов, задаваемых по умолчанию . . . . . . 173
Перегрузка функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Знакомство с программой Triple . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Создание перегруженных функций . . . . . . . . . . . . . . . . . . . . . . . 175
Вызов перегруженных функций . . . . . . . . . . . . . . . . . . . . . . . . . 175
Подстановка вызова функций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Знакомство с программой Taking Damage . . . . . . . . . . . . . . . . . . 176
Задание функций для подстановки . . . . . . . . . . . . . . . . . . . . . . . 177
Вызов подставленных функций . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Знакомство с программой «Безумные библиотекари» . . . . . . . . . . . . . . . 178
Подготовка программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Функция main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Функция askText() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Функция askNumber() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Функция tellStory() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Глава 6. Ссылки. Игра «Крестики-нолики» . . . . . . . . . . . . . . . . . . . 184
Использование ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Знакомство с программой Referencing . . . . . . . . . . . . . . . . . . . . . 184
Создание ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Доступ к значениям по ссылкам . . . . . . . . . . . . . . . . . . . . . . . . . 186
Изменение значений через указывающие на них ссылки . . . . . . . 187
Передача ссылок для изменения аргументов . . . . . . . . . . . . . . . . . . . . . 187
Знакомство с программой Swap . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Передача по значению . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Передача по ссылке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Передача ссылок для обеспечения эффективности . . . . . . . . . . . . . . . . 190
Знакомство с программой Inventory Displayer . . . . . . . . . . . . . . . 190
Несколько слов о подводных камнях, связанных
с передачей ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Объявление параметров как константных ссылок . . . . . . . . . . . . 192
Передача константной ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Решение о том, как передавать аргументы . . . . . . . . . . . . . . . . . . . . . . . 193
Возврат ссылок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Знакомство с программой Inventory Referencer . . . . . . . . . . . . . . 194
Возврат ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Отображение значения возвращенной ссылки . . . . . . . . . . . . . . . 196
Присваивание возвращенной ссылки другой ссылке . . . . . . . . . . 196
Присваивание возвращенной ссылки переменной . . . . . . . . . . . . 196
Изменение объекта с помощью возвращенной ссылки . . . . . . . . . 196
Знакомство с игрой «Крестики-нолики» . . . . . . . . . . . . . . . . . . . . . . . . . 197
Планирование игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
Подготовка программы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Функция main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Функция askYesNo() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Функция askNumber() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Функция humanPiece() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Функция opponent() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Функция displayBoard() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Функция winner() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
Функция isLegal() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Функция humanMove() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Функция computerMove() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Функция announceWinner() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Глава 7. Указатели. Игра «Крестики-нолики 2.0» . . . . . . . . . . . . . 213
Основы работы с указателями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Знакомство с программой Pointing . . . . . . . . . . . . . . . . . . . . . . . . 214
Объявление указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Инициализация указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Присваивание адресов указателям . . . . . . . . . . . . . . . . . . . . . . . 216
Разыменование указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Переприсваивание указателей . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Использование указателей на объекты . . . . . . . . . . . . . . . . . . . . 219
Понятие об указателях и константах . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Использование константного указателя . . . . . . . . . . . . . . . . . . . 220
Использование указателя на константу . . . . . . . . . . . . . . . . . . . . 221
Использование константного указателя на константу . . . . . . . . . 221
Константы и указатели: итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Передача указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Знакомство с программой Swap Pointer Version . . . . . . . . . . . . . . 223
Передача по значению . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Передача константного указателя . . . . . . . . . . . . . . . . . . . . . . . . 225
Возврат указателей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Знакомство с программой Inventory Pointer . . . . . . . . . . . . . . . . . 226
Возврат указателя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Использование возвращенного указателя для отображения
значения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Присваивание указателю возвращенного указателя . . . . . . . . . . 229
Присваивание переменной значения,
на которое указывает возвращенный указатель . . . . . . . . . . . 229
Изменение объекта посредством возвращенного указателя . . . . . 230
Понятие о взаимоотношениях указателей и массивов . . . . . . . . . . . . . . . 231
Знакомство с программой Array Passer . . . . . . . . . . . . . . . . . . . . . 231
Использование имени массива в качестве константного
указателя . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Передача и возврат массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Знакомство с программой «Крестики-нолики 2.0» . . . . . . . . . . . . . . . . . 234
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Глава 8. Классы. Игра «Тамагочи» . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Определение новых типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Знакомство с программой Simple Critter . . . . . . . . . . . . . . . . . . . . 239
Определение класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Определение функций-членов . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Инстанцирование объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Доступ к членам данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Вызов функций-членов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Использование конструкторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Знакомство с программой Constructor Critter . . . . . . . . . . . . . . . . 244
Объявление и определение конструктора . . . . . . . . . . . . . . . . . . 245
Автоматический вызов конструктора . . . . . . . . . . . . . . . . . . . . . . 246
Установка уровней доступа к членам . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Знакомство с программой Private Critter . . . . . . . . . . . . . . . . . . . . 247
Задание открытых и закрытых уровней доступа . . . . . . . . . . . . . 248
Определение функций доступа . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Определение константных функций-членов . . . . . . . . . . . . . . . . 250
Использование статических членов данных и функций-членов . . . . . . . . 251
Объявление и инициализация статических членов данных . . . . . 252
Обращение к статическим членам данных . . . . . . . . . . . . . . . . . . 253
Объявление и определение статических функций-членов . . . . . . 254
Вызов статических функций-членов . . . . . . . . . . . . . . . . . . . . . . 254
Знакомство с игрой «Тамагочи» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Планирование игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Планирование псевдокода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Класс Critter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Функция main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Глава 9. Более сложные классы и работа с динамической
памятью. Игровое лобби . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Использование агрегирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Знакомство с программой Critter Farm . . . . . . . . . . . . . . . . . . . . . 266
Использование членов данных, являющихся объектами . . . . . . . 268
Использование контейнерных членов данных . . . . . . . . . . . . . . . 268
Использование дружественных функций и перегрузка операторов . . . . . 269
Знакомство с программой Friend Critter . . . . . . . . . . . . . . . . . . . . 269
Создание дружественных функций . . . . . . . . . . . . . . . . . . . . . . . 271
Перегрузка операторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Динамическое выделение памяти.............................. 272
Знакомство с программой Heap . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Использование оператора new . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Использование оператора delete . . . . . . . . . . . . . . . . . . . . . . . . . 275
Избегаем утечек памяти . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Работа с членами данных и кучей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Знакомство с программой Heap Data Member . . . . . . . . . . . . . . . . 278
Объявление членов данных, которые указывают на значения
в куче . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Объявление и определение деструкторов . . . . . . . . . . . . . . . . . . 282
Объявление и определение конструкторов копирования . . . . . . . 283
Перегрузка оператора присваивания . . . . . . . . . . . . . . . . . . . . . 286
Знакомство с программой Game Lobby . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Класс Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Класс Lobby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Функция-член Lobby::AddPlayer() . . . . . . . . . . . . . . . . . . . . . . . . 292
Функция-член Lobby::RemovePlayer() . . . . . . . . . . . . . . . . . . . . . 294
Функция-член Lobby::Clear() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Функция-член operator<<() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Функция main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Глава 10. Наследование и полиморфизм. Игра Blackjack . . . . . . . 300
Знакомство с наследованием . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Знакомство с программой Simple Boss . . . . . . . . . . . . . . . . . . . . . 302
Наследование от базового класса . . . . . . . . . . . . . . . . . . . . . . . . 303
Создание объектов производного класса . . . . . . . . . . . . . . . . . . . 304
Использование унаследованных членов . . . . . . . . . . . . . . . . . . . 305
Управление доступом при работе с наследованием . . . . . . . . . . . . . . . . 305
Знакомство с программой Simple Boss 2.0 . . . . . . . . . . . . . . . . . . 305
Использование модификаторов доступа для членов данных . . . . 307
Использование модификаторов доступа при создании
производных классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Вызов и переопределение функций-членов базового класса . . . . . . . . . . 308
Знакомство с программой Overriding Boss . . . . . . . . . . . . . . . . . . 308
Вызов конструкторов базового класса . . . . . . . . . . . . . . . . . . . . . 310
Объявление виртуальных функций-членов базового класса..... 310
Переопределение виртуальных функций-членов базового
класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Вызов функций-членов базового класса . . . . . . . . . . . . . . . . . . . 312
Использование перегруженных операторов присваивания
и конструкторов копирования в производных классах . . . . . . . . . . . . 313
Знакомство с полиморфизмом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Знакомство с программой Polymorphic Bad Guy . . . . . . . . . . . . . . 314
Использование указателей базового класса для объектов
производного класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Определение виртуальных деструкторов . . . . . . . . . . . . . . . . . . . 317
Использование абстрактных классов . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Знакомство с программой Abstract Creature . . . . . . . . . . . . . . . . . 318
Объявление чистых виртуальных функций . . . . . . . . . . . . . . . . . 319
Наследование от абстрактного класса . . . . . . . . . . . . . . . . . . . . . 319
Знакомство с игрой Blackjack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Разработка классов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Планирование логики игры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Класс Card . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Класс Hand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Класс GenericPlayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Класс Player . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Класс House . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Класс Deck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Класс Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Функция main() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Перегрузка функции operator<<() . . . . . . . . . . . . . . . . . . . . . . . . 336
Резюме . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Вопросы и ответы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Вопросы для обсуждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Упражнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Приложение 1. Создание первой программы на языке С++ . . . . . 341
Приложение 2. Приоритет операторов языка С++ . . . . . . . . . . . . . 347
Приложение 3. Ключевые слова языка С++ . . . . . . . . . . . . . . . . . . . 349
Приложение 4. Таблица символов ASCII . . . . . . . . . . . . . . . . . . . . . . 350
Приложение 5. Управляющие последовательности . . . . . . . . . . . . . 352