Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование на C++.pdf
Скачиваний:
61
Добавлен:
23.03.2016
Размер:
1.88 Mб
Скачать

Создание массивов в динамической памяти

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

Конструкторы

Создание и уничтожение объектов Копирование

объектов

Одиночное

наследование

Множественное наследование

Обобщённое

программирова-

ние

Перегрузка

операций

Исключения

Операция 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