- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений
Объекты в полях других объектов
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое
программирова- ние
Перегрузка
операций
Исключения
Если объект класса X содержится в поле x объекта Y, то конструктор для этого поля вызывается из конструктора Y посредством следующей синтаксической конструкции:
Y :: Y( формальные_параметры_конструктора_Y )
: x( фактические_параметры_конструктора_X ) {
...
}
Между прочим, любое поле объекта может быть инициализировано таким образом, даже если тип этого поля не является классом. Например, конструктор класса Demo может быть переписан как
Demo :: Demo ( int x ): x(x) {
cout << " cons :" << x << " ";
}
30 / 99
Пример: объекты в полях других объектов
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое
программирова- ние
Перегрузка
операций
Исключения
class Cont { private :
Demo d; public :
Cont ( int x );
};
Cont :: Cont ( int x ): d(x) {}
int main ()
{
Cont c (100); return 0;
}
Вывод:
cons :100 destr :100
Обратите внимание: деструктор класса Demo был автоматически вызван при уничтожении объекта класса Cont.
Проблема копирования объектов
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое |
программирова- |
ние |
Перегрузка
операций
Исключения
Следует понимать, что передача объекта в качестве параметра при вызове метода автоматически влечёт создание копии объекта. Смысл копирования заключается в том, что изменение копии объекта внутри метода не приводит к изменению объекта-оригинала (семантика копирования). Кроме этого, копирование объектов осуществляется при инициализации объявляемых переменных.
По умолчанию создаётся побитовая копия внутреннего состояния объекта. Однако, во многих случаях для обеспечения семантики копирования побитового копирования недостаточно.
Например, для рассмотренного ранее класса IntArray побитовое копирование объекта приводит к тому, что возникает два объекта, которые содержат в поле a указатели на один и тот же массив целых чисел. Поэтому после уничтожения одного из них второй объект «потеряет» массив.
32 / 99
Объявление конструктора копий
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное
наследование
Обобщённое |
программирова- |
ние |
Перегрузка
операций
Исключения
Для создания «правильных» копий объектов необходимо объявить конструктор копий, прототип которого выглядит как
имя_класса ( const имя_класса & obj );
Этот конструктор будет автоматически вызываться всякий раз, когда необходимо создать копию объекта.
Пример:
class IntArray {
...
IntArray ( const IntArray & obj );
...
};
IntArray :: IntArray ( const IntArray & obj ): n( obj .n) { a = new int [n ];
memcpy (a , obj .a , n* sizeof ( int ));
}
33 / 99