Глава 17. Конструкторы: копирование и присваивание__________________473
В строке 10 объявлен конструктор копий, а в строке 12 — операция присваивания класса INT_ARRAY. Объявления этих функций вполне корректны, но, как вы увидите, для этого класса их определения неправильны (в определение входит тело функции).
Фактически в определении конструктора копий и операции присваивания намеренно используется буквальное копирование, чтобы продемонстрировать компиляторную версию этих функций (см. листинг 17.2).
1 |
// SMARRAY2.CPP — Определение интеллектуального массива |
|
// и испытательный стенд для него. |
2 |
// Copyright (с) 1995. All Rights Reserved. |
3 |
// By Paul Kimmel. |
4 |
#include <mem.h> |
5 |
// ttdefine NDEBUG // для выключения assert снимите комментарий |
6 |
ftinclude <assert.h> |
7 |
ftinclude "smarray2.h" |
8 |
// Конструктор — Добавляет единицу к размеру массива для хранения |
9 |
// фиктивного значения на случай использования недопустимого |
|
// индекса. |
10 |
INTARRAY::INT ARRAY( unsigned int sz) : max(sz), |
|
dummy ( sz + 1) , data ( new int[sz +1]) |
11 |
( |
12 |
// Если new возвращает допустимый блок памяти, |
13 |
// тогда data не нуль. Функция memset |
14 |
// инициализирует блок значением 0. |
15 |
if(data) |
16 |
memset( data, 0, dummy); |
17 |
else |
18 |
max = -1; |
19 |
} |
20 |
// деструктор |
21 |
INTARRAY::~INTARRAY() |
22 |
{ |
23 |
// освобождение массива |
24 |
delete [] data; |
25 |
// установка указателя в 0 позволяет |
26 |
// проверять его недопустимость |
27 |
data = 0; |
28 |
} |
29 |
// — Предупреждение - |
|
// Этот класс использует буквальное копирование. |
30 |
// Не пользуйтесь им в реальных программах. |
31 |
// Этот конструктор копий демонстрирует вариант |
32 |
// "буквального" конструктора, генерируемого компилятором. |