- •Джесс Либерти
- •Об авторе
- •Посвящение
- •Благодарности
- •Введение
- •Для кого эта книга
- •Неделя №1 Основные вопросы
- •Несколько слов для программистов на языке c
- •Что дальше
- •День 1-й. Первые шаги Введение
- •Программы
- •Решение многих проблем
- •Процедурное, структурированное и объектно-ориентированное программирование
- •Инкапсуляция
- •Наследование и многократное использование
- •Полиморфизм
- •Нужно ли сначала изучить язык c
- •Стандарт ansi
- •Подготовка к программированию
- •Среда разработки
- •Компиляция исходного кода программы
- •Создание исполняемого файла с помощью компоновщика
- •Цикл разработки
- •Построение проекта приветствия
- •Ошибки компиляции
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Кратко об объекте cout
- •Комментарии
- •Виды комментариев
- •Использование комментариев
- •Напоследок предупреждение: осторожнее с комментариями!
- •Функции
- •Использование функций
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 3-й. Переменные и константы
- •Что такое переменная
- •Резервирование памяти
- •Размер целых
- •Знаковые и беззнаковые типы
- •Базовые типы переменных
- •Определение переменной
- •Чувствительность к регистру букв
- •Ключевые слова
- •Создание нескольких переменных одного типа
- •Присваивание значений переменным
- •Ключевое слово typedef
- •В каких случаях следует использовать типы short и long
- •Переполнение беззнаковых целых
- •Переполнение знаковых целочисленных значений
- •Символы
- •Символы и числа
- •Специальные символы
- •Константы
- •Литеральные константы
- •Символьные константы
- •Определение констант с помощью директивы #deiine
- •Определение констант с помощью ключевого слова const
- •Константы перечислений
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 4-й. Выражения и операторы
- •Выражения
- •Символы пробелов
- •Блоки и комплексные варажения
- •Операции
- •Операторы
- •Оператор присваивания
- •Математические операторы
- •Целочисленное деление и деление по модулю
- •Совместное использование математических операторов с операторами присваивания
- •Инкремент декремент
- •Префикс и постфикс
- •Приоритеты операторов
- •Вложение круглых скобок
- •Что такое истинно
- •Операторы отношений
- •Оператор if
- •Использование отступов в программных кодых
- •Ключевое слово else
- •Сложные конструкции с if
- •Использование фигурных скобок для вложенных операторов if
- •Логические операторы
- •Логическое и
- •Логическое или
- •Логическое нет
- •Вычисление по сокращенной схеме
- •Приоритеты операторов отношений
- •Подробнее об истине и лжи
- •Условный оператор
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 5-й. Функции
- •Что такое функция
- •Возвращаемые значения, параметры и аргументы
- •Объявление и определение функций
- •Объявление функции
- •Прототипы функций
- •Определение функции
- •Выполнение функций
- •Локальные переменные
- •Глобальные переменные
- •Глобальные переменные; будьте начеку
- •Подробнее о локальных переменных
- •Операторы, используемые в функциях
- •Подробнее об аргументах функций
- •Использование функций в качестве параметров функций
- •Параметры - это локальные переменные
- •Подробнее о возвращаемых значениях
- •Значения параметров, используемые по умолчанию
- •Перегрузка функций
- •Дополнительные сведения о функциях
- •Подставляемые inline-функции
- •Рекурсия
- •Работа функций - приподнимаем завесу тайны
- •Уровни абстракции
- •Разбиение памяти
- •Стек и функции
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 6-й. Базовые классы
- •Создание новых типов
- •Зачем создавать новый тип
- •Классы и члены классов
- •Объявление класса
- •Несколько слов об используемых именах
- •Определение объекта
- •Классы в сравнении с объектами
- •Получение доступа к членам класса
- •Значения присваиваются объектам, а не классам
- •Что объявишь, то и будешь иметь
- •Ограничение доступа к членам класса
- •Оставьте данные класса закрытыми
- •Ограничение доступа к данным - это не способ защиты данных, а лишь средство облегчения программирования
- •Определение методов класса
- •Конструкторы и деструкторы
- •Конструкторы и деструкторы, заданные по умолчанию
- •Использование конструктора, заданного по умолчанию
- •Объявление функций-членов со спецификатором const
- •Чем отличается интерфейс от выполнения класса
- •Где следует распологать в программе объявления классов и определения методов
- •Выполнение с подстановкой
- •Классы содержащие другие классы в качестве данных-членов
- •Структуры
- •Почему два ключевых слова несут одинаковую смысловую нагрузку
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 7-й. Циклы
- •Организация циклов
- •История оператора goto
- •Почему следует избегать оператора goto
- •Организация циклов с помощью оператора while
- •Сложные конструкции с оператором while
- •Операторы break и continue
- •Использование конструкции while(true)
- •Организация циклов с помощью конструкции do...While
- •Использование конструкции do...While
- •Оператор for
- •Сложные выражения с оператором for
- •Множественные инициализации и приращения счетчиков цикла
- •Нулевые параметры цикла for
- •Использование пустых циклов for
- •Вложенные циклы
- •Область видимости переменных-счетчиков циклов for
- •Обобщение сведений о циклах
- •Оператор switch
- •Обработка комманд менб с помощью оператора switch
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Итоги первой недели
- •Неделя №2 Основные вопросы
- •Что дальше
- •День 8-й. Указатели
- •Что такое указатель
- •Использование указателя как средства хранения адреса
- •Имена указателей
- •Оператор разыменовывания
- •Указатели, адреса и переменные
- •Обращение к данным через указатели
- •Использование адреса, хранящегося в указателе
- •Для чего нужны указатели
- •Память стековая и динамически распределяемая
- •Оператор new
- •Оператор delete
- •Что такое утечка памяти
- •Размещение объектов в области динамической памяти
- •Удаление объектов
- •Доступ к членам класса
- •Динамическое размещение членов класса
- •Указатель this
- •Блуждающие, дикие или зависшие указатели
- •Использование ключевого слова const при объявлении указателей
- •Использование ключевого слова const при объявлении указателей и функций-членов
- •Указатель const this
- •Вычисления с указателями
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 9-й. Ссылки
- •Что такое ссылка
- •Использование оператора адреса (&) при работе со ссылками
- •Ссылки нельзя переназначать
- •На что можно ссылаться
- •Нулевые указатели и нулевые ссылки
- •Передача аргументов функций как ссылок
- •Передача указателей в функцию swap()
- •Передача ссылок в функцию swap()
- •Представления о заголовках функций и прототипах
- •Возвращение нескольких значений
- •Возвращение значений с помощью ссылок
- •Передача ссылок на переменные как средство повышения эффективности
- •Передача константного указателя
- •Ссылки в качестве альтернативы
- •Когда лучше использовать ссылки, а когда - указатели
- •Коктейль из ссылок и указателей
- •Не возвращайте ссылку на объект, который находиться вне области видимости!
- •Возвращение ссылки на в области динамического обмена
- •А где же уазатель?
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 10-й. Дополнительные возможности использования функции
- •Перегруженные функции-члены
- •Использование значений, заданных по умолчанию
- •Выбор между значениями по умолчанию и перегруженными функциями
- •Конструктор, принятый по умолчанию
- •Перегрузка конструкторов
- •Инициализация объектов
- •Конструктор-копировщик
- •Перегрузка операторов
- •Запись Функции инкремента
- •Перегрузка префиксных операторов
- •Типы возвратов перегруженных функций операторов
- •Возвращение безымянных временных объектов
- •Использование указателя this
- •Перегрузка постфиксных операторов
- •Различия между преинкрементном и постинкрементном
- •Оператор суммирования
- •Перегрузка оператора суммирования
- •Основные принципы перегрузки операторов
- •Ограничения перегрузки операторов
- •Что можно перегружать
- •Оператор присваивания
- •Операторы преобразований
- •Операторы преобразования типов
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 11-й. Наследование
- •Что такое наследование
- •Иерархия и наследование
- •Царство животных
- •Синтаксис наследования классов
- •Закрытый или защищенный
- •Конструкторы и деструкторы
- •Передача аргументов в базовые конструкторы
- •Замещение функций
- •Сокрытие метода базового класса
- •Вызов базового метода
- •Виртуальные методы
- •Как работают виртуальные методы
- •Нельзя брать там, находясь здесь
- •Дробление объекта
- •Виртуальные деструкторы
- •Виртуальный конструктор-копировщик
- •Цена виртуальности методов
- •Вопросы и ответы
- •Коллоквиум
- •Упражнения
- •День 12-й. Массивы и связанные листы
- •Что такое массивы
- •Элементы массива
- •Вывод данных за пределами массива
- •Ошибки подсчета столбцов для забора
- •Инициализация массива
- •Объявление массивов
- •Массивы объектов
- •Многомерные массивы
- •Инициализация многомерного массива
- •Несколько слов о памяти
- •Массивы указателей
- •Объявление массивов в области динамического обмена
- •Указатель на массив или массив указателей
- •Имена массивов и указателей
- •Удаление массива из области динамической памяти
- •Массивы символов
- •Функции strcpy() и strncpy()
- •Классы строк
- •Связанные списки и другие структуры
- •Общие представления о связанных списках
- •Делегирование ответственности
- •Компоненты связанных списков
- •Что мы узнали в этой главе
- •Классы массивов
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 13-й. Полиморфизм
- •Проблемы с одиночным наследованием
- •Перенос метода вверх по иерархии классов
- •Приведение указателя к типу производного класса
- •Добавление объекта в два списка
- •Множественное наследование
- •Из каких частей состоят объекты, полученные в результате множественного наследования
- •Конструкторы классов, полученных в результате множественного наследования
- •Двусмысленность ситуации
- •Наследование от общего базового класса
- •Виртуальное наследование
- •Проблемы с множественным наследованием
- •Классы-мандаты
- •Абстрактные типы данных
- •Чистые виртуальные функции
- •Выполнение чистых виртуальных функций
- •Сложная иерархия абстракций
- •Когда следует использовать абстрактные типы данных
- •Логика использования абстрактных классов
- •Пара слов о множественном наследовании, абстрактных типах данных и языке Java
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 14-й. Специальные классы и функции
- •Статические переменные-члены
- •Статические функции-члены
- •Указатели на функции
- •Зачем нужны указатели на функции
- •Массивы указателей на функции
- •Передача указателей на функции в другие функции
- •Использование typedef с указателями на функции
- •Указатели на функции члены
- •Массивы указателейна функции-члены
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Неделя №3 Основные вопросы
- •Что дальше
- •День 15-й. Дополнительные возможности наследования
- •Вложение
- •Доступ к членам вложенного класса
- •Фильтрация доступа к вложенным классам
- •Цена вложений
- •Передача объекта как значения
- •Различные пути передачи функциональности классу
- •Делегирование
- •Закрытое наследование
- •Классы друзья
- •Функции друзья
- •Функции друзья и перегрузка оператора
- •Перегрузка оператора вывода
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 16-й. Потоки
- •Знакомство с потоками
- •Инкапсуляция
- •Буферизация
- •Потоки и буферы
- •Стандартные объекты ввода-вывода
- •Переадресация
- •Вывод данных с помощью cin
- •Проблемы, возникающие при вводе строк
- •Другие методы объекта cin
- •Ввод одного символа
- •Использование функции gef() без параметров
- •Использование функции get() с параметром
- •Ввод строк со стандартного устройства ввода
- •Использование функции cin.Ignore()
- •Функции-члены peek() и putback()
- •Ввод данных с помощью cout
- •Очистка буфера вывода
- •Функции-члены объекта cout
- •Манипуляторы, флаги и команды форматирования
- •Использование функции cout.Width()
- •Установка символов заполнения
- •Установка флагов
- •Сравнение потоков и функции printf()
- •Использование файлов для ввода и вывода данных
- •Объекты ofstream
- •Состояния условий
- •Открытие файлов для ввода-вывода
- •Настройка открытия файла объектом ofstream
- •Двоичные и тектовые файлы
- •Установка параметров ввода-вывода с помощью коммандной строки
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 17-й. Пространства имен
- •Введение
- •Вызов по имени функций и классов
- •Создание пространства имен
- •Объявление и определение типов
- •Объявление функций за пределами пространства имен
- •Добавление новых членов
- •Вложения пространства имен
- •Использование пространства имен
- •Ключевое слово using
- •Использование using как оператора
- •Использование using в объявлениях
- •Псевдонимы пространства имен
- •Неименованные пространства имен
- •Стандартное пространство имен std
- •Вопросы и ответы
- •Построение моделей
- •Проектирование программ: язык моделирования
- •Процесс проектирования программ
- •Анализ требований
- •Ситуация использования
- •Определение пользователей
- •Определение первой ситуации использования
- •Создание модели домена
- •Обобщение
- •Вложение
- •Ассоциация
- •Разработка сценариев
- •Разработка путеводителей
- •Диаграммы взаимодействий
- •Создание пакетов
- •Анализ совместимости приложения
- •Анализ существующих систем
- •Прочая документация
- •Визуализация
- •Артефакты
- •Проектирование
- •Что такое классы
- •Преобразования
- •Другие преобразования
- •Обработка данных
- •Устройства
- •Статическая модель
- •Карточки crc
- •Как проводить заседания с карточками
- •Сфокусируемся на распределении ответственности
- •Как сделать класс живым
- •Ограничения карточек crc
- •Создание модели uml no картонкам crc
- •Отношения между классами
- •Множественное наследование против вложения
- •Дискриминаторы и силовые классы
- •Динамическая модель
- •Диаграммы переходов состояний
- •Сверхсостояния
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 19-й. Шаблоны
- •Что такое шаблоны
- •Параметризованные типы
- •Создание экземпляра шаблона
- •Объявление шаблона
- •Использование имени шаблона
- •Выполнение шаблона
- •Функции шаблона
- •Шаблоны и друзья
- •Дружественные классы и функции, не являющиеся шаблонами
- •Дружественный класс или функция как общий шаблон
- •Использование экземпляров шаблона
- •Специализированные функции
- •Статические члены и шаблоны
- •Стандартная библиотека шаблонов
- •Контейнеры
- •Последовательные контейнеры
- •Контейнер двухсторонней очереди
- •Очередь
- •Ассоциативные контейнеры
- •Другие ассоциативные контейнеры
- •Классы алгоритмов
- •Операции, не изменяющие последовательность
- •Алгоритмы изменения последовательности
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 20-й. Отслеживание исключительных ситуаций и ошибок
- •Ошибки, погрешности, ляпусы и "гнилой" код
- •Исключительные ситуации
- •Несколько слов о "гнилом" коде
- •Исключения
- •Как используются исключения
- •Использование блоков try и catch
- •Перехват исключений
- •Использование нескольких операторов catch
- •Наследование исключений
- •Данные в классах исключений и присвоение имен объектам исключений
- •Исключения и шаблоны
- •Исключения без ошибок
- •Ошибки и отладка программы
- •Точка останова
- •Анализ значений переменных
- •Исследование памяти
- •Код ассемблера
- •Вопросы и ответы
- •Коллоквиум
- •Контрольные вопросы
- •Упражнения
- •День 21-й. Что дальше
- •Процессор и компилятор
- •Просмотр промежуточного файла
- •Использование директивы #define
- •Использование директивы #define для создания констант
- •Использование директивы #define для тестирования
- •Комманда препроцессора #else
- •Включение файлов и предупреждение ошибок включения
- •Макросы
- •Зачем нужны все эти круглые скобки
- •Макросы в сравнении с функциями шаблонов
- •Подставляемые функции
- •Операции со строками
- •Оператор взятия в кавычки
- •Конкатенация
- •Встроенные макросы
- •Макрос assert()
- •Оладка программы с помощью assert()
- •Макрос assert() вместо исключений
- •Побочные эффекты
- •Инварианты класса
- •Печать промежуточных значений
- •Уровни отладки
- •Операции с битами данных
- •Сброс битов
- •Инверсия битов
- •Битовые поля
- •Стиль программирования
- •Отступы
- •Фигурные скобки
- •Длинные строки
- •Конструкции с оператором switch
- •Текст программы
- •Имена идентификаторов
- •Правописание и использование прописных букв в именах
- •Комментарии
- •Организация доступа к данным и методам
- •Определения классов
- •Включение файлов
- •Макрос assert()
- •Ключевое слово const
- •Сделаем еще один шаг вперед
- •Где получить справочную информацию и советы
- •Журналы
- •Выскажите свое мнение о книге
- •Вопросы и ответы
- •Коллоквиум Контрольные вопросы
- •Упражнения
- •Подведение итогов
- •Приложение а Приоритеты операторов
- •Приложение б
- •Приложение в Двоичные о числа
- •Другие системы счисления
- •Еще об основаниях
- •Двоичная система счисления
- •Почему именно основание 2
- •Биты, байты и полубайты
- •Что такое килобайт
- •Двоичные числа
- •Шестнадцатерична система счисления
- •Приложение г - Ответы День 1 Контрольные вопросы
- •Упражнения
- •День 2 Контрольные вопросы
- •Упражнения
- •День 3 Контрольные вопросы
- •Упражнения
- •День 4 Контрольные вопросы
- •Упражнения
- •День 5 Контрольные вопросы
- •Упражнения
- •День 6 Контрольные вопросы
- •Упражнения
- •День 7 Контрольные вопросы
- •Упражнения
- •День 8 Контрольные вопросы
- •Упражнения
- •День 9 Контрольные вопросы
- •Упражнения
- •День 10 Контрольные вопросы
- •Упражнения
- •День 11 Контрольные вопросы
- •Упражнения
- •День 12 Контрольные вопросы
- •Упражнения
- •День 13 Контрольные вопросы
- •Упражнения
- •День 14 Контрольные вопросы
- •Упражнения
- •День 15 Контрольные вопросы
- •Упражнения
- •День 16 Контрольные вопросы
- •Упражнения
- •День 17 Контрольные вопросы
- •Упражнения
- •День 18 Контрольные вопросы
- •Упражнения
- •День 19 Контрольные вопросы
- •Упражнения
- •День 20 Контрольные вопросы
- •Упражнения
- •День 21 Контрольные вопросы
- •Упражнения
Использование typedef с указателями на функции
Конструкция void (*)(int&, int&) весьма громоздка. Для ее упрощения можно воспользоваться ключевым словом typedef, объявив новый тип (назовем его VPF) указателей на функции, возвращающие void и принимающие две ссылки на значения типа int. Листинг 14.9 представляет собой переписанную версию листинга 14.8 с использованием этого подхода.
Листинг 14.8. Использование оператора typedef для объявления типа указателей на функции
1: // Листинг 14.9. Использование typedef для
2: // объявления типа указателей на функции
3: #include <iostream.h>
4:
5: void Square (int&,int&);
6: void Cube (int&, int&);
7: void Swap (int&, int &);
8: void GetVals(int&, int&);
9: typedef void (*VPF) (int&, int&);
10: void PrintVals(VPF,int&, int&);
11:
12: int main()
13: {
14: int val0ne=1, valTwo=2;
15: int choice;
16: bool fQuit = false;
17:
18: VPF pFunc;
19:
20: while (fQuit == false)
21: {
22: cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: ";
23: cin >> choice;
24: switch (choice)
25: {
26: case 1:pFunc = GetVals; break;
27: case 2:pFunc = Square; break;
28: case 3:pFunc = Cube; break;
29: case 4:pFunc = Swap; break;
30: default:fQuit = true; break;
31: }
32: if (fQuit == true)
33: break;
34: PrintVals ( pFunc, valOne, valTwo);
35: }
36: return 0;
37: }
38:
39: void PrintVals( VPF pFunc,int& x, int& y)
40: {
41: cout << "x: " << x << " y: " << y << endl;
42: pFunc(x,y);
43: cout << "x: " << x << " y: " << y << endl;
44: }
45:
46: void Square (int & rX, int & rY)
47: {
48: rX *= rX;
49: rY *= rY;
50: }
51:
52: void Cube (int & rX, int & rY)
53: {
54: int tmp;
55:
56: tmp = rX;
57: rX *= rX;
58: rX = rX * tmp;
59:
60: tmp = rY;
61: rY *= rY;
62: rY = rY * tmp;
63: }
64:
65: void Swap(int & rX, int & rY)
66: {
67: int temp;
68: temp = rX;
69: rX = rY;
70: rY = temp;
71: }
72:
73: void GetVals (int & rValOne, int & rValTwo)
74: {
75: cout << "New value for ValOne: ";
76: cin >> rValOne;
77: cout << "New value for ValTwo: ";
78: cin >> rValTwo;
79: }
Результат:
(0)Quit (1 )Change Values (2)Square (3)Cube (4)Swap: 1
x: 1 y: 2
New value for ValOne: 2
New value for ValTwo: 3
x: 2 y: 3
(0)Quit (1 )Change Values (2)Square (3)Cube (4)Swap: 3
x: 2 y: 3
x: 8 y: 27
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 2
x: 8 y: 27
x: 64 y: 729
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 4
x: 64 y: 729
x: 729 y: 64
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 0
Анализ: В строке 9 с помощью оператора typedef объявляется новый тип VPF как указатели на функции, возвращающие void и принимающие две ссылки на int. В строке 10 объявляется функция PrintVals(), которая принимает три параметра: VPF и две ссылки на integer. В строке 18 указатель Pfunc объявляется как принадлежащий TnnyVPF.
После объявления типа VPF дальнейшее использование указателя pFunc и функции PrintVals() становится проще и понятнее. Информация, выводимая программой на экран, не изменилась.
