Джесс Либерти Освой самостоятельно C++ за 21 день В книге широко представлены возможности новейшей версии программного продукта Microsoft Visual C++. Подробно описаны средства и подходы программирования современных профессиональных приложений. Материалы книги дополнены многочисленными демонстрационными программами, в процессе разработки которых максимально используются возможности программных инструментов Microsoft Visual Studio. Особое внимание уделено новинкам версии 6.0 и новейшим технологиям объектно-ориентированного программирования, включая использование библиотеки MFC и шаблонов классов, а также создание связанных списков. Отдельное занятие посвящено вопросам объектно-ориентированного анализа и проектирования приложений. Подробно рассмотрены все средства и подходы конструирования собственных пользовательских классов. Книга рассчитана на широкий круг читателей, интересующихся современными проблемами программирования. Оглавление Введение 21 НЕДЕЛЯ 1. ОСНОВНЫЕ ВОПРОСЫ 23 День 1. Первые шаги 24 День 2. Составные части программы на языке C++ 40 День 3. Переменные и константы 51 День 4. Выражения и операторы 71 День 5. Функции 100 День 6. Базовые классы 135 День 7. Циклы 167 НЕДЕЛЯ 2. ОСНОВНЫЕ ВОПРОСЫ 201 День 8. Указатели 202 День 9. Ссылки 233 День 10. Дополнительные возможности использования функции 264 День 11. Наследование 301 День 12. Массивы и связанные листы 333 День 13. Полиморфизм 374 День 14. Специальные классы и функции 413 НЕДЕЛЯ 3. ОСНОВНЫЕ ВОПРОСЫ 451 День 15. Дополнительные возможности наследования 452 День 16. Потоки 505 День 17. Пространства имен 544 День 18. Анализ и проектирование объектно-ориентированных программ 561 День 19. Шаблоны 596 День 20. Отслеживание исключительных ситуаций и ошибок 644 День 21. Что дальше 673 Приложение А. Приоритеты операторов 725
Приложение Б. Ключевые слова C++ Приложение В. Двоичные и шестнадцатиричные числа Приложение Г. Ответы Предметный указатель Подробное содержание Введение Для кого написана эта книга Соглашения НЕДЕЛЯ 1 ОСНОВНЫЕ ВОПРОСЫ Несколько слов для программистов на языке С Что дальше День 1. Первые шаги Введение Краткий экскурс в историю языка C++ Программы Решение многих проблем Процедурное, структурированное и объектно-ориентированное программирование Язык C++ и объектно-ориентированное программирование Эволюция языка C++ Нужно ли сначала изучить язык С C++ и Java Стандарт ANSI Подготовка к программированию Среда разработки Компиляция исходного кода программы Создание исполняемого файла с помощью компоновщика Цикл разработки Первая программа на языке C++ — HELLO.срр Осваиваем компилятор Visual C++ 6 Построение проекта приветствия Ошибки компиляции Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 2. Составные части программы на языке С++ Простая программа на языке C++ Кратко об объекте cout Комментарии Виды комментариев
727 728 736 807 21 21 21 23 23 23 24 24 24 25 25 26 28 29 29 29 30 30 31 31 32 33 33 36 36 37 37 38 38 38 39 40 40 42 44 44
Использование комментариев Напоследок предупреждение: осторожнее с комментариями! Функции Использование функций Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 3. Переменные и константы Что такое переменная Резервирование памяти Размер целых Знаковые и беззнаковые типы Базовые типы переменных Определение переменной Чувствительность к регистру букв Ключевые слова Создание нескольких переменных одного типа Присваивание значений переменным Ключевое слово typedef В каких случаях следует использовать типы short и long Переполнение беззнаковых целых Переполнение знаковых целочисленных значений Символы Символы и числа Специальные символы Константы Литеральные константы Символьные константы Определение констант с помощью директивы #deiine Определение констант с помощью ключевого слова const Константы перечислений Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 4. Выражения и операторы Выражения Символы пробелов Блоки и комплексные выражения Операции
45 45 46 47 49 49 49 49 50 51 51 52 52 53 54 55 56 57 57 58 59 60 61 61 62 63 63 64 64 64 65 65 66 68 68 69 70 70 71 71 72 72 72
Операторы Оператор присваивания Математические операторы Целочисленное деление и деление по модулю Совместное использование математических операторов с операторами присваивания Инкремент и декремент Префикс и постфикс Приоритеты операторов Вложение круглых скобок Что такое ИСТИННО Операторы отношений Оператор if Использование отступов в программных кодах Ключевое слово else Сложные конструкции с if Использование фигурных скобок для вложенных операторов if Логические операторы Логическое И Логическое ИЛИ Логическое НЕТ Вычисление по сокращенной схеме Приоритеты операторов отношений Подробнее об истине и лжи Условный оператор Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 5. Функции Что такое функция Возвращаемые значения, параметры и аргументы Объявление и определение функций Объявление функции Прототипы функций Определение функции Выполнение функций Локальные переменные Глобальные переменные Глобальные переменные; будьте начеку Подробнее о локальных переменных Операторы, используемые в функциях
74 74 74 75 77 77 78 80 80 81 82 83 86 86 88 90 92 93 93 93 93 94 95 95 97 97 98 98 98 100 100 101 101 102 102 104 106 106 108 109 110 111
Подробнее об аргументах функций Использование функций в качестве параметров функций Параметры — это локальные переменные Подробнее о возвращаемых значениях Значения параметров, используемые по умолчанию Перегрузка функций Дополнительные сведения о функциях Подставляемые inline-функции Рекурсия Работа функций — приподнимем завесу тайны Уровни абстракции Разбиение памяти Стек и функции Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 6. Базовые классы Создание новых типов Зачем создавать новый тип Классы и члены Объявление класса Несколько слов об используемых именах Определение объекта Классы в сравнении с объектами Получение доступа к членам класса Значения присваиваются объектам, а не классам Что объявишь, то и будешь иметь Ограничение доступа к членам класса Оставьте данные класса закрытыми Ограничение доступа к данным — это не способ защиты данных, а лишь средство облегчения программирования Определение методов класса Конструкторы и деструкторы Конструкторы и деструкторы, заданные по умолчанию Использование конструктора, заданного по умолчанию Объявление функций-членов со спецификатором const Чем отличается интерфейс от выполнения класса Где следует располагать в программе объявления классов и определения методов Выполнение с подстановкой Классы, содержащие другие классы в качестве данных-членов
112 112 113 114 116 119 121 122 123 128 128 129 131 132 132 133 133 134 135 135 136 136 136 137 138 138 138 138 139 139 142 143 145 147 148 148 151 152 155 156 159
Структуры Почему два ключевых слова несут одинаковую смысловую нагрузку Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 7. Циклы Организация циклов История оператора goto Почему следует избегать оператора goto Организация циклов с помощью оператора while Сложные конструкции с оператором while Операторы break и continue Использование конструкции while(true) Организация циклов с помощью конструкции do...while Использование конструкции do...while Оператор for Сложные выражения с оператором for Использование пустых циклов for Вложенные циклы Область видимости переменных-счетчиков циклов for Обобщение сведений о циклах Оператор switch Обработка команд меню с помощью оператора switch Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения НЕЛЕЛЯ 2 ОСНОВНЫЕ ВОПРОСЫ Что дальше День 8. Указатели Что такое указатель Использование указателя как средства хранения адреса Имена указателей Оператор разыменования Указатели, адреса и переменные Обращение к данными через указатели Использование адреса, хранящегося в указателе Для чего нужны указатели Память стековая и динамически распределяемая
162 163 163 164 165 165 165 167 167 167 168 169 170 171 173 174 175 176 178 181 182 183 184 186 189 192 192 192 193 193 201 201 202 202 204 206 206 207 208 209 211 211
Оператор new Оператор delete Что такое утечка памяти Размещение объектов в области динамически памяти Удаление объектов Доступ к членам класса Динамическое размещение членов класса Указатель this Блуждающие, дикие или зависшие указатели Использование ключевого слова const при объявлении указателей Использование ключевого слова const при объявлении указателей и функций-членов Указатель const this Вычисления с указателями Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 9. Ссылки Что такое ссылка Использование оператора адреса (&) при работе со ссылками Ссылки нельзя переназначать На что можно ссылаться Нулевые указатели и нулевые ссылки Передача аргументов функций как ссылок Передача указателей в функцию swap() Передача ссылок в функцию swap() Представления о заголовках функций и прототипах Возвращение нескольких значений Возвращение значений с помощью ссылок Передача ссылок на переменные как средство повышения эффективности Передача константного указателя Ссылки в качестве альтернативы Когда лучше использовать ссылки, а когда — указатели Коктейль из ссылок и указателей Не возвращайте ссылку на объект, который находится вне области видимости! Возвращение ссылки на объект в области динамического обмена А где же указатель? Резюме Вопросы и ответы Коллоквиум
212 213 215 215 216 217 218 221 222 225 226 227 228 230 231 231 231 231 233 233 234 236 237 239 239 241 242 243 244 246 247 250 253 255 256 257 259 261 261 262 262
Контрольные вопросы Упражнения День 10. Дополнительные возможности использования функции Перегруженные функции-члены Использование значений, заданных по умолчанию Выбор между значениями по умолчанию и перегруженными функциями Конструктор, принятый по умолчанию Перегрузка конструкторов Инициализация объектов Конструктор-копировщик Перегрузка операторов Запись функции инкремента Перегрузка префиксных операторов Типы возвратов перегруженных функций операторов Возвращение безымянных временных объектов Использование указателя this Перегрузка постфиксных операторов Различия между преинкрементом и постинкрементом Оператор суммирования Перегрузка оператора суммирования Основные принципы перегрузки операторов Ограничения перегрузки операторов Что можно перегружать Оператор присваивания Операторы преобразований Операторы преобразования типов Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 11. Наследование Что такое наследование Иерархия и наследование Царство животных Синтаксис наследования классов Закрытый или защищенный Конструкторы и деструкторы Передача аргументов в базовые конструкторы Замещение функций Сокрытие метода базового класса Вызов базового метода Виртуальные методы
262 263 264 264 266 269 269 269 271 272 276 277 278 280 281 283 284 284 286 288 290 290 290 291 293 296 297 298 299 299 299 301 301 302 303 303 305 307 309 313 315 317 319
Как работают виртуальные функции Нельзя брать там, находясь здесь Дробление объекта Виртуальные деструкторы Виртуальный конструктор-копировщик Цена виртуальности методов Резюме Вопросы и ответы Коллоквиум Тест Упражнения День 12. Массивы и связанные листы Что такое массивы Элементы массива Ввод данных за пределы массива Ошибки подсчета столбов для забора Инициализация массива Объявление массивов Массивы объектов Многомерные массивы Инициализация многомерного массива Несколько слов о памяти Массивы указателей Объявление массивов в области динамического обмена Указатель на массив или массив указателей Имена массивов и указателей Удаление массива из области динамической памяти Массивы символов Функции strcpy() и strncpy() Классы строк Связанные списки и другие структуры Общие представления о связанных списках Делегирование ответственности Компоненты связанных списков Что мы узнали в этой главе Классы массивов Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 13. Полиморфизм Проблемы с одиночным наследованием
323 324 324 326 327 330 330 331 331 331 332 333 333 333 335 338 338 340 341 343 344 345 346 347 348 348 350 351 353 354 360 361 361 362 371 371 372 372 373 373 373 374 374
Перенос метода вверх по иерархии классов Приведение указателя к типу производного класса Добавление объекта в два списка Множественное наследование Из каких частей состоят объекты, полученные в результате множественного наследования Конструкторы классов, полученных в результате множественного наследования Двусмысленность ситуации Наследование от общего базового класса Виртуальное наследование Проблемы с множественным наследованием Классы-мандаты Абстрактные типы данных Чистые виртуальные функции Выполнение чистых виртуальных функций Сложная иерархия абстракций Когда следует использовать абстрактные типы данных Логика использования абстрактных классов Пара слов о множественном наследовании, абстрактных типах данных и языке Java Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 14. Специальные классы и функции Статические переменные-члены Статические функции-члены Указатели на функции Зачем нужны указатели на функции Массивы указателей на функции Передача указателей на функции в другие функции Использование typedef с указателями на функции Указатели на функции-члены Массивы указателей на функции-члены Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения НЕДЕЛЯ 3 ОСНОВНЫЕ ВОПРОСЫ
377 377 380 380 383 384 386 387 391 394 395 396 399 401 404 408 408 409 410 410 411 411 411 413 413 418 420 423 426 429 431 433 436 438 438 439 439 439 451
Что дальше День 15. Дополнительные возможности наследования Вложение Доступ к членам вложенного класса Фильтрация доступа к вложенным классам Цена вложений Передача объекта как значения Различные пути передачи функциональности классу Делегирование Закрытое наследование Классы друзья Функции друзья Функции друзья и перегрузка оператора Перегрузка оператора вывода Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 16. Потоки Знакомство с потоками Инкапсуляция Буферизация Потоки и буферы Стандартные объекты ввода-вывода Переадресация Вывод данных с помощью cin Строки Проблемы, возникающие при вводе строк Оператор >> возвращает ссылку на объект istream Другие методы объекта cin Ввод одного символа Ввод строк со стандартного устройства ввода Вывод данных с помощью cout Очистка буфера вывода Функции-члены объекта cout Манипуляторы, флаги и команды форматирования Использование функции cout.width() Установка символов заполнения Установка флагов Сравнение потоков и функции printf() Использование файлов для ввода и вывода данных Объекты ofstream
451 452 452 458 458 459 462 465 466 475 483 492 492 497 501 502 502 502 503 505 505 505 506 509 509 509 510 511 512 514 515 515 517 522 522 522 524 524 525 526 528 531 531
Состояния условий Открытие файлов для ввода-вывода Настройка открытия файла объектом ofstream Двоичные и текстовые файлы Установка параметров ввода-вывода с помощью командной строки Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 17. Пространства имен Введение Вызов по имени функций и классов Создание пространства имени Объявление и определение типов Объявление функций за пределами пространства имени Добавление новых членов Вложения пространств имен Использование пространств имен Ключевое слово using Использование using как оператора Использование using в объявлениях Псевдонимы пространства имен Неименованные пространства имен Стандартное пространство имен std Резюме Вопросы и ответы Контрольные вопросы Упражнения День 18. Анализ и проектирование объектно-ориентированных программ Является ли C++ объектно-ориентированным языком программирования Построение моделей Проектирование программ: язык моделирования Процесс проектирования программ Идея Анализ требований Ситуации использования Определение пользователей Определение первой ситуации использования Создание модели домена Разработка сценариев Разработка путеводителей
532 532 533 536 538 541 541 542 542 543 544 544 545 548 549 550 550 550 551 553 553 555 557 557 558 559 560 560 560 561 561 562 563 565 566 567 567 568 569 570 573 574
Анализ совместимости приложения Анализ существующих систем Прочая документация Визуализация Артефакты Проектирование Что такое классы Преобразования Другие преобразования Статическая модель Карточки CRC Отношения между классами Динамическая модель Диаграммы переходов состояний Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 19. Шаблоны Что такое шаблоны Параметризованные типы Создание экземпляра шаблона Объявление шаблона Использование имени шаблона Выполнение шаблона Функции шаблона Шаблоны и друзья Дружественные классы и функции, не являющиеся шаблонами Дружественный класс или функция как общий шаблон Использование экземпляров шаблона Специализированные функции Статические члены и шаблоны Стандартная библиотека шаблонов Контейнеры Последовательные контейнеры Вектор Список Контейнер двухсторонней очереди Стеки Очередь Ассоциативные контейнеры Карта
576 577 577 578 578 579 579 581 581 582 583 585 589 592 594 594 595 595 595 596 596 597 597 597 599 599 602 603 603 607 610 615 620 624 624 625 625 631 633 633 634 634 634
Другие ассоциативные контейнеры Классы алгоритмов Операции, не изменяющие последовательность Алгоритмы изменения последовательности Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 20. Отслеживание исключительных ситуаций и ошибок Ошибки, погрешности, ляпсусы и "гнилой" код Исключительные ситуации Несколько слов о "гнилом" коде Исключения Как используются исключения Использование блоков try и catch Перехват исключений Использование нескольких операторов catch Наследование исключений Данные в классах исключений и присвоение имен объектам исключений Исключения и шаблоны Исключения без ошибок Ошибки и отладка программы Точки останова Анализ значений переменных Исследование памяти Код ассемблера Резюме Вопросы и ответы Коллоквиум Контрольные вопросы Упражнения День 21. Что дальше Препроцессор и компилятор Просмотр промежуточного файла Использование директивы #define Использование директивы #define для создания констант Использование директивы #define для тестирования Команда препроцессора #else Включение файлов и предупреждение ошибок включения Макросы Зачем нужны все эти круглые скобки Макросы в сравнении с функциями шаблонов
637 638 639 640 641 641 642 642 642 644 644 645 646 646 647 652 652 652 655 658 665 668 668 669 669 669 669 670 670 671 671 671 673 673 674 674 674 674 675 676 678 678 680
Подставляемые функции Операции со строками Оператор взятия в кавычки Конкатенация Встроенные макросы Макрос assert() Отладка программы с помощью макроса assert() Макрос assert() вместо исключений Побочные эффекты Инварианты класса Печать промежуточных значений Уровни отладки Операции с битами данных Оператор И (AND) Оператор ИЛИ (OR) Оператор исключающего ИЛИ (OR) Оператор дополнения до единицы Установка битов Сброс битов Инверсия битов Битовые поля Стиль программирования Отступы Фигурные скобки Длинные строки Конструкции с оператором switch Текст программы Имена идентификаторов Правописание и использование прописных букв в именах Комментарии Организация доступа к данным и методам Определения классов Включение файлов Макрос assert() Ключевое слово const Сделаем еще один шаг вперед Где получить справочную информацию и советы Журналы Выскажите свое мнение о книге Резюме Вопросы и ответы Контрольные вопросы Упражнения
680 682 682 682 683 683 685 685 686 686 691 693 699 699 699 700 700 700 700 701 701 704 704 705 705 705 706 706 707 707 708 708 708 709 709 709 709 710 710 710 711 712 712
Приложение А. Приоритеты операторов 725 Приложение Б. Ключевые слова C++ 727 Приложение В. Двоичные и шестнадцатеричные числа 728 Приложение Г. Ответы 736 Предметный указатель 807 Предметный указатель А ASCII, 62; 732 вектор, 625 А добавление элемента, 626 доступ к элементам, 631 аргумент, 101 командной строки, 539 пустой, 626 передача как значения, 113 размер, 626 по умолчанию, 266 виртуальная функция, 323 вложение классов, 452 указатель на функцию, 429 Г экземпляр шаблона, 610 аргумент функции, 47 гигабайт, 732 Д Б двухсторонняя очередь, 633 байт, 731 делегирование ответственности, 466 библиотека ANSI, 548 деструктор базового класса, 307 iostream, 505 виртуальный, 326 определение, 505 директива препроцессора шаблонов, 596; 624 бит, 731 #define, 674 #else, 675 установка значения, 699 #endif, 675 битовое поле, 701 #ifdef, 674 буферизация, 506 В #ifndef, 674 #include, 673 ввод-вывод взятия в кавычки (#), 682 в файловых системах, 531 конкатенации (##), 682 заполнение символами, 525 конкатенация операторов, 514 дополнение до единицы, 700 доступ манипуляторы, 530 защищенный, 305 на печать, 638 общие представления, 509 к статическим членам, 415 к членам вложенного класса, 458 одного символа, 515 спецификатор, 305 очистка буфера, 522 стиль, 708 переадресация, 509 с командной строки, 538 фильтрация, 458 класс-друг, 483 с помощью макроса, 692 шаблона, 603 стандартное устройство, 517 3 строк, 511 замещение функций, 313 форматирование, 524; 530
И индекс массива, 333 инициализация конструктором, 271 массива, 338 массива символов, 351 многомерного массива, 344 инкапсуляция ввода-вывода данных, 505 интерфейс Java, 409 исключение, 646; 685 данные, 658 использование, 647 наследование, 655 полиморфизм, 662 исключительная ситуация, 645 обработка, 647 итератор, 631 К карта, 634 килобайт, 732 класс Animal, 599; 693 CAT, 273; 292; 342; 413 Counter, 276 deque, 633 Employee, 456 iostream, 510 list, 631 Mammal, 303 map, 634 ofstream, 531 ostream, 522 PartsCatalog, 465 Pegasus, 374 Rectangle, 264 String, 354; 452; 627; 687 Timer, 408 vector, 625 алгоритма, 638 вложение, 452 выполнение средствами другого класса, 466
друг, 483 запись в файл, 536 инварианта, 686 исключение, 655 контейнер, 624 мандат, 395 массивов, 371; 597 наследование, 677 обработки исключительных ситуаций, 650 объявление, 677 определение, 708 потоков ввода-вывода, 509 ключевое слово, 727 catch, 647 class, 303 const, 65; 709 enum, 66 inline, 122; 680 namespace, 548 new, 347 operator, 286 protected, 305 return, 114 static, 415; 548 template, 597 try, 647 typedef, 59; 431 using, 553 virtual, 322 общие представления, 57 комментарии, 44; 707 компилятор ключ командной строки, 674 компиляция, условная, 674 константа общие представления, 64 определение с помощью #define, 65; 674 определение с помощью const, 65 перечисления, 66 константа литеральная, 64
символьная, 64 конструктор базового класса, 307 виртуальный копировщик, 327 заданный по умолчанию, 269 инициализация в иерархии классов, 309 копировщик, 272 перегрузка, 269; 309 преобразование типов, 294 при множественном наследовании, 384 контейнер, 624 ассоциативный, 634 вектор, 625 двухсторонняя очередь, 633 карта, 634 последовательный, 625 список, 631 конфликт имен, 544 концевой нулевой символ, 351; 512 копирование объектов в производный класс, 327 глубинное, 272 поверхностное, 272 Л лексема, 674 DEBUG, 683 М макрос, 678 assert(), 683; 709 EVAL, 698 MAX, 678 MIN, 678 PRINT(x), 692 встроенный, 683 маскирование, 700 массив argv, 538 в области динамической памяти, 347 вычисления с именами массивов, 348
запись за пределы, 335 имя, 348 индексирование, 333 инициализация, 338; 344 многомерный, 343 общие представления, 333 объектов, 341 объявление, 340 символов, 351 удаление из динамической памяти, 350 указателей, 346 указателей на методы, 436 указателей на функции, 426 шаблон, 598 метод перенос в базовый класс, 377 фильтрация, 375 явное обращение, 317; 387 Н наследование абстрактных классов, 404 виртуальное, 391 закрытое, 475 защищенных данных, 305 множественное, 380 общие принципы, 302 от общего базового класса, 387 открытое, 303; 466 синтаксис, 303 О область видимости, 110; 546 счетчика цикла, 183 объект cin, 510 cout, 42; 522 ofstream, 531 ввода-вывода, 509 видимость, 546 временный, 280 временный безымянный, 281 дробление при передаче, 324 инициализация, 271
копирование, 272 приращение, 277 присваивание, 291 создание в производном классе, 307 суммирование, 287 удаление из производного класса, 307 функции, 638 оператор break, 171; 189 catch, 652 continue, 171 delete[], 350 dynamic_cast, 377 endl, 43 for, 177 goto, 167 return, 105; 114 switch, 186; 187; 705 using, 553 watch, 711 while, 169 ассоциация, 725 ввода (>>), 510 видимости (::), 545 вывода (<<), 497; 522 вызова функции, 638 индексирования ([]), 341; 342; 602; 626 конкатенации (&), 358 константный, 358 объявление, 286; 289 ограничения на перегрузку, 290 перегрузка, 276; 290 побитовый, 699 преобразования типа, 296 приоритет, 725 присваивания (=), 291; 296; 602 с двумя операндами, 289 с одним операндом, 286 суммирования (+), 286 тип возврата, 280
число операндов, 290 явного обращения к методу класса, 317 определение функции,104 отладка программ, 668 отладка программы побочный эффект, 686 с помощью макроса assert(), 685 уровни, 693 очередь, 634 П память глобальных имен, 129 регистры, 129 резервирование, 52 стековая, 129 параметр функции, 47; 101 список формальных, 102 другая функция, 112 значение по умолчанию, 116 перегрузка конструктора, 269 оператора вывода, 497 оператора суммирования, 288; 359 постфиксных операторов, 284 префиксных операторов, 278 функций, 119; 264 переменная в памяти компьютера, 51 глобальная, 108; 129 допустимые значения, 54 имя, 51; 55 инициализация, 55; 58 локальная, 106 общие представления, 51 переполнение, 61 размер, 52 статическая, 413; 620 перечисление, 66 печать, 638 побочный эффект, 686 полиморфизм, 319
полубайт, 732 постинкремент, 284 поток iostream, 510 ofstream, 531 ostream, 522 ввода-вывода, 509 флаги состояния, 526 преинкремент, 284 препроцессор, 673 программа HELLO.CPP, 40 комментарии, 44 отладка, 683 стиль, 704 пространство имен Window, 548 вложение, 550 добавление членов, 550 неименованное, 557 общие представления, 544 объявление, 548 псевдоним, 557 стандартное std, 548; 558; 625 прототип функции, 102 Р регистр, 129 рекурсия, 123 С связанный список, 360 библиотечный, 631 делегирование ответственности, 361 компоненты, 362 типы, 361 узлы, 361 связывание динамическое и статическое, 323 сигнатура, 313 сигнатура функции, 102 символ ASCII, 54; 62 комментариев, 44
компиляции, 669 начала управляющей последовательности, 63 разрыва строки, 43; 64 сохранение, 62 специальный, 63 табуляции, 44; 64 форматирования, 530 система счисления, 728 двоичная, 730 основание, 729 шестнадцатеричная, 732 список, 631 стандартная библиотека шаблонов STL, 624 стек, 129; 633 вершина, 633 вызовов, 652 стиль программирования, 704 строка текста, 42; 351 ввод с клавиатуры, 351 доступ к символам, 358 определение длины, 359 Т таблица виртуальных функций, 323 тело функции, 47 тип данных char, 62 long, 60 short, 60 void, 47 абстрактный (ADT), 396 базовый (стандартный), 54 беззнаковый, 53 знаковый, 53 неявное преобразование, 360 объявление с помощью typedef, 59; 431 определение при выполнении, 377 параметризованный, 597 переменной, 52; 57 преобразование, 294 точка останова, 669 У
указатель ptr, 323; 436 rhs, 275 this, 283; 420 vptr, 323 вершины стека, 130 метода, 433 на массив, 348 функции, 420 Ф файл включение в программу, 676 двоичный, 536 открытие для ввода-вывода, 532 препроцессора, 673 текстовый, 536 файл заголовка, 677 algorithm, 638 iomanip.h, 530 iostream.h, 43 list, 631 map, 634 stack, 633 stdio.h, 528 strin.h, 353 String.hpp, 458 vector, 625 добавление в программу, 102 прототипы функций, 102 Фибоначчи, ряд, 124; 184 флаг битовый, 699 инверсия, 701 сброс, 700 установка, 700 функции stmcpy(), 353 функция bad(), 532 cin,get(), 515 cin.getline(), 518 cin.ignore(), 520 cin.peek(), 521
cin.putback(), 521 close(), 532 cout.fill, 525 cout.put(), 522 cout.setf, 526 cout.width(), 524 cout.write(), 523 eof(), 532 fail(), 532 flush(), 522 Invariants(), 686 main(), 41; 100; 116 printf(), 528 sizeof(), 53 strcpy(), 353 strlen(), 359 аргумент, 47; 101 в пространстве имен, 550 виртуальная, 319; 662 возвращаемое значение, 101 встроенная, 100 друг, 492 друг шаблона, 603 замещение, 313 общие представления, 46; 100 объявление, 102 определение, 104 параметр, 47 параметры, передача, 101 перегрузка, 119; 264 подставляемая, 122; 680 полиморфизм, 119 пользовательская, 100 прототип, 102 сигнатура, 102 сокрытие от производного класса, 315 специализированная, 615 статическая, 418; 620 тело, 47 установка аргументов по умолчанию, 266 чистая виртуальная, 399
функция шаблона, 603 Ц цикл, 167 do...while, 175 for, 177 goto, 167 while, 169 бесконечный, 189 вложенный, 182 пустой, 181 Ш шаблон, 596 Array, 597 выполнение, 599 друг, 607
имя, 599 объявление, 597 объявление экземпляра, 598 параметры, 597 передача экземпляра в функцию, 602 статические члены, 620 экземпляр, 597; 610 Э экземпляр шаблона, 598; 610 элемент массива, 333 инициализация, 340