Глава 17. Конструкторы: копирование и присваивание__________________473

В строке 10 объявлен конструктор копий, а в строке 12 — операция присваивания класса INT_ARRAY. Объявления этих функций вполне корректны, но, как вы увидите, для этого класса их определения неправильны (в определение входит тело функции).

Фактически в определении конструктора копий и операции присваивания намеренно используется буквальное копирование, чтобы продемонстрировать компиляторную версию этих функций (см. листинг 17.2).

h04131.jpg

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

// "буквального" конструктора, генерируемого компилятором.