- •Джесс Либерти
- •Об авторе
- •Посвящение
- •Благодарности
- •Введение
- •Для кого эта книга
- •Неделя №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 Контрольные вопросы
- •Упражнения
Упражнения
1. Опишите класс JetPlane (Реактивный самолет), наследуя его от двух базовых классов — Rocket (Ракета) и Airplane (Самолет).
class JetPlane : public Rocket, public Airplane
2. Произведите от класса JetPlane, объявленного в первом упражнении, новый класс 747.
class 747 : public JetPlane
3. Напишите программу, производящую классы Саг (Легковой автомобиль) и Bus (Автобус) от класса Vehicle (Машина). Опишите класс Vehicle как абстрактный тип данных с двумя чистыми виртуальными функциями. Классы Саг и Bus не должны быть абстрактными.
class Vehicle
{
virtual void Move() = 0;
virtual void Haul() = 0;
};
class Car : public Vehicle
{
virtual void Move();
virtual void Haul();
}:
class Bus : public Vehicle
{
virtual void Move();
virtual void Haul();
};
4. Измените программу из предыдущего упражнения таким образом, чтобы класс Саr тоже стал ADT, и произведите от него три новых класса: SportsCar (Спортивный автомобиль), Wagon (Фургон) и Coupe (Двухместный автомобиль-купе). В классе Саr должна замещаться одна из виртуальных функций, объявленных в классе Vehicle, с вызовом функции базового класса.
class Vehicle
{
virtual void Move() = 0;
virtual void Haul() = 0;
};
class Car : public Vehicle
{
virtual void Move():
};
class Bus : public Vehicle
{
virtual void Move();
virtual void Haul();
}
class SportsCar : public Car
{
virtual void Haul();
}
class Coupe : public Car
{
virtual void Haul();
}
День 14 Контрольные вопросы
1. Могут ли статические переменные-члены быть закрытыми?
Да. Поскольку они являются переменными-членами, то доступ к ним может управляться подобно доступу к любым другим переменным-членам. Если статическая переменная-член объявлена как закрытая, то доступ к ней можно получить только с помошью открытого статического метода класса.
2. Объявите статическую переменную-член.
static int itsStatic;
3. Объявите статическую функцию.
static int SomeFunction();
4. Объявите указатель на функцию, принимающую параметр типа int и возвращающую значение типа long.
long (*function)(int);
5. Измените указатель, созданный в задании 4, на указатель на функцию-член класса Саr.
long ( Car::*function)(int);
6. Объявите массив из десяти указателей, созданных в задании 5.
long ( Car::*function)(int) theArray [10];
Упражнения
1. Напишите короткую программу, объявляющую класс с одной обычной переменной-членом и одной статической переменной-членом. Создайте конструктор, выполняющий инициализацию переменной-члена и приращение статической переменной-члена. Затем объявите деструктор, который уменьшает на единицу значение статической переменной.
1: class myClass
2: {
3: public:
4: myClass();
5: ~myClass();
6: private:
7: int itsMember;
8: static int itsStatic;
9: };
10:
11: myClass::myClass():
12: itsMember(1)
13: {
14: itsStatic++;
15: }
16:
17:myClass::~myClass()
18: {
19: itsStatic—-;
20: }
21:
22: int myClass::itsStatic = 0;
23:
24: int main()
25: {}
2. Используя программный блок из упражнения 1, напишите короткую выполняемую
программу, которая создает три объекта, а затем выводит значения их перемен-
ных-членов и статической переменной-члена класса. Затем последовательно уда-
ляйте объекты и выводите на экран значение статической переменной-члена.
1: #include <iostream.h>
2:
3: class myClass
4: {
5: public:
6: myClass();
7: ~myClass();
8: void ShowMember()
9: void ShowStatic();
10: private:
11: int itsMember;
12: static int itsStatic;
13: };
14:
15: myClass::myClass():
16: itsMember(1)
17: {
18: itsStatic++;
19: }
20:
21: myClass::~myClass()
22: {
23: itsStatic--;
24: cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29: cout << "itsMember: " << itsMereber << endl;
30: }
31:
32: void myClass::ShowStatic()
33: {
34: cout << "itsStatic: " << itsStatic << endl;
35: }
36: int myClass::itsStatic = 0;
37:
38: int main()
39: {
40: myClass obj1;
41: obj1.ShowMember();
42: obj1.ShowStatic();
43:
44: myClass obj2;
45: obj2.ShowMember();
46: obj2.ShowStatic();
47:
48: myClass obj3;
49: obj3.ShowMember();
50: obj3.ShowStatic();
51: return 0;
52: }
3. Измените программу из упражнения 2 таким образом, чтобы доступ к статическойпеременной-члену осуществлялся с помощью статической функции-члена. Сделайте статическую переменную-член закрытой.
1: #include <iostream.h>
2:
3: class myClass
4: {
5: public:
6: myClass();
7: ~myClass();
8: void ShowMember();
9: static int GetStatic();
10: private:
11: int itsMember;
12: static int itsStatic;
13: }
14:
15: myClass::myClass():
16: itsMember(l)
17: {
18: itsStatic++;
19: }
20:
21: myClass::~myClass()
22: {
23: itsStatic--;
24: cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29: cout << "itsMember: " << itsMember << endl;
30: }
31:
32: int myClass::itsStatic = 0;
33:
34: void myClass::GetStatic()
35: {
36: return itsStatic;
37: }
38:
39: int main()
40: {
41: myClass obj1:
42: obj1.ShowMeraber();
43: cout << "Static: " << myClass::GetStatic() << endl;
44:
45: myClass obj2;
46: obj2.ShowMember();
47: cout << "Static " << myClass::GetStatic() << endl;
48:
49: myClass obj3;
50: obj3.ShowMember();
51: cout << "Static: " << myClass::GetStatic() << endl;
52: return 0;
53: }
4. Создайте в программе из упражнения 3 указатель на функцию-член для доступа к значению нестатической переменной-члена и воспользуйтесь им для вывода этих значений на печать.
1: #include ciostream.h>
2:
3: class myClass
4: {
5: public
6: myClass();
7: ~myClass();
8: void ShowMember();
9: static int GetStatic();
10: private:
11: int itsMember;
12: static int itsStatic;
13: }
14:
15: myClass::myClass():
16: itsMember(1)
17: {
18: itsStatic++;
19: }
20:
21: myClass::~myClassO
22: {
23: itsStatic--;
24: cout << "In destructor. ItsStatic: " << itsStatic << endl;
25: }
26:
27: void myClass::ShowMember()
28: {
29: cout << "itsMember: " << itsMember << endl;
30: }
31:
32: int myClass::itsStatic = 0;
33:
34: int myClass::GetStatic()
35: {
36: return itsStatic;
37: }
38:
39: int main()
40: {
41: void (myClass::*PMF) ();
42:
43: PMF=myClass: :ShowMember;
44:
45: myClass obj1;
46: (obj1.*PMF)();
47: cout << "Static: " << myClass::GetStatic() << endl;
48:
49: myClass obj2:
50: (obj2.*PMF)();
51: cout << "Static: " << myClass::GetStatic() << endl;
52:
53: myClass obj3;
54: (obj3.*PMF)();
55: cout << "Static: " << myClass::GetStatic() << endl;
56: return 0;
57: }
5. Добавьте две дополнительные переменные-члена к классу из предыдущих упраж-
нений. Добавьте методы доступа, возвращающие значения всех этих переменных.
Все функции-члены должны возвращать значения одинакового типа и иметь оди-
наковую сигнатуру. Для доступа к этим методам используйте указатель на функ-
цию-член.
1: #include<iostream.h>
2:
3: class myClass
4: {
5: public:
6: myClass();
7: ~myClass();
8: void ShowMember();
9: void ShowSecond();
10: void ShowThird();
11: static int GetStatic();
12: private:
13: int itsMember;
14: int itsSecond;
15: int itsThird;
16: static int itsStatic;
17: }
18:
19: myClass::myClass()
20: itsMember(1),
21: itsSecond(2),
22: itsThird(3)
23: {
24: itsStatic++;
25: }
27: myClass::^rnyClass()
28: {
29: itsStatic--;
30: cout << "In destructor. ItsStatic: " << itsStatic << endl;
31: }
32:
33: void myClass::ShowMember()
34: {
35: cout << "itsMember: " << itsMember << endl;
36: }
37:
38: void myCIass:: ShowSecond()
39: {
40: cout << "itsSecond: " << itsSecond << endl;
41: }
42:
43: void myClass::ShowThird()
44: {
45: cout << "itsThird: " << itsThird << endl;
46: }
47: int myClass::itsStatic = 0;
48:
49: int myClass::GetStatic()
50: {
51: return itsStatic;
52: }
53:
54: int main()
55: {
56: void (myClass::*PMF) ();
57:
58: myClass obj1;
59: PMF=myClass::ShowMember;
60: (obj1.*PMF)();
61: PMF=myClass::ShowSecond;
62: (obj1.*PMF)();
63: PMF=myClass::ShowThird;
64: (ob]1 "PMF)();
65: cout << "Static: " << myClass::GetStatic() << endl;
66:
67: myClass obj2;
68: PMF=myClass::ShowMerober;
69: (obj2.*PMF)();
70: PMF=myClass::ShowSecond;
71: (obj2.*PMF)();
72: PMF=myClass::ShowThird;
73: (obj2. *PMF)();
74: cout << "Static: " << myClass::GetStatic() << endl;
75:
76: myClass obj3;
77: PMF=myClass::ShowMember;
78: (obj3. *PMF)();
79: PMF=myClass::ShowSecond;
80: (obj3.*PMF)();
81: PMF=royClass::ShowThird;
82: (obj3.*PMF)();
83: cout << "Static: " << myClass::GetStatic() << endl;
84: return 0;
85: }
