- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений
Создание массивов в динамической памяти
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое |
программирова- |
ние |
Перегрузка
операций
Исключения
Операция new совмещает выделение памяти с инициализацией (с вызовом конструктора) и возвращает указатель на созданный и инициализированный объект.
В C++ вообще не принято использовать функцию malloc, потому что для создания массивов также используется специальная форма операции new:
new тип_элемента [ размер ]
Например,
int *a = new int [10];
Point ** pa = new Point * [20];
Обратите внимание на то, что массив объектов можно выделять только в случае, если в классе определён конструктор по умолчанию. При этом этот конструктор будет вызван для каждого объекта в массиве.
Point *b = new Point [20]; // ошибка
22 / 99
Удаление объектов и массивов
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое
программирова-
ние
Перегрузка
операций
Исключения
Так как в C++ не предусморено автоматическое управление памятью (нет сборщика мусора), то все объекты, созданные операцией new, должны быть в какой-то момент явно освобождены.
Для этого существует оператор delete, имеющий следующий синтаксис:
delete |
указатель_на_объект ; |
// |
для |
объектов |
delete |
[] указатель_на_массив ; |
// |
для |
массивов |
Например,
Point |
*p |
= new Point (10.0 , 20.0); |
|
delete |
p; |
|
|
int *a |
= |
new |
int [20]; |
delete |
[] |
a; |
|
23 / 99
Объявление деструктора
Базовые
сведения
Введение
Ссылки
Классы
Поля и методы
Конструкторы
Создание и уничтожение объектов Копирование
объектов
Одиночное
наследование
Множественное наследование
Обобщённое |
программирова- |
ние |
Перегрузка
операций
Исключения
Внутреннее состояние объекта может содержать указатели (ссылки) на другие объекты, созданные в его конструкторе.
Вязыке без сборки мусора освобождение такого объекта может привести к утечке памяти.
Деструктор – это экземплярный метод, предназначенный для освобождения ресурсов, принадлежащих объекту, непосредственно перед уничтожением этого объекта.
Вязыке C++ деструкторы жизненно необходимы. Прототип деструктора имеет вид
~имя_класса ();
Деструктор вызывается при уничтожении объекта. В частности, его автоматически вызывает оператор delete.
24 / 99
|
|
|
Пример: объявление деструктора |
|||||||
Базовые |
|
|
|
|
|
|
|
|
|
|
сведения |
1 |
class IntArray { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
Введение |
2 |
private : |
|
|
|
|
|
|
|
|
Ссылки |
|
|
|
|
|
|
|
|
||
3 |
int |
*a; |
|
|
|
|
|
|
|
|
Классы |
|
|
|
|
|
|
|
|||
4 |
int |
n; |
|
|
|
|
|
|
|
|
Поля и методы |
|
|
|
|
|
|
|
|||
5 |
public : |
|
|
|
|
|
|
|
|
|
Конструкторы |
|
|
|
|
|
|
|
|
||
|
IntArray ( int n ); |
|
|
|
|
|
|
|
||
Создание и |
6 |
|
|
|
|
|
|
|
||
уничтожение |
7 |
int |
& at ( int i ); |
|
|
|
|
|
|
|
объектов |
8 |
virtual ~ IntArray (); |
|
|
|
|
|
|
||
Копирование |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
объектов |
9 |
}; |
|
|
|
|
|
|
|
|
Одиночное |
10 |
|
|
|
|
|
|
|
|
|
наследование |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Множественное |
11 |
IntArray :: IntArray ( int |
n ): n(n) |
{ |
a = |
new |
int |
[n ]; } |
||
наследование |
12 |
int & IntArray :: at ( int |
i) |
{ return |
a[i ]; } |
|
|
|||
|
|
|
||||||||
Обобщённое |
13 |
IntArray ::~ IntArray () |
{ |
delete |
[] |
a; |
} |
|
|
|
программирова- |
|
|
|
|
|
|
|
|
|
|
ние |
|
|
|
|
|
|
|
|
|
|
Перегрузка |
|
|
|
|
|
|
|
|
|
|
операций |
|
|
|
|
|
|
|
|
|
|
Исключения |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 / 99 |