Глава 16. Перегрузка операций_______________________________389

12 (

13 // Если new возвращает допустимый блок памяти

14 // тогда data не нуль. Функция memset

15 // инициализирует блок значением 0.

16 if(data)

17 memset( data, 0, dummy);

18 else

19 max = -1;

20 }

21 // деструктор

22 INT_ARRAY::~INT_ARRAY()

23 {

24 // освобождение массива

25 delete [] data;

26 // установка указателя в 0 позволяет -

27 // проверять его недопустимость

28 data = 0;

29 }

30 // Очень кратко, но допустимость индекса проверяется.

31 // Этот класс проблем — превосходный кандидат для

32 // обработки исключительных ситуаций (см. главу 22).

33 int& INT ARRAY::operator[]( unsigned int index)

34 {

35 // Защита выключена, если NODEBUG определена

36 assert( index < max) ;

37 return index < max ? data[index] : data[ dummy ];

38 }

39 // Отладочный стенд указывает, что код протестирован,

40 // позволяет его отлаживать, проверять при внесении изменений,

41 // легко включается и выключается директивами

42 // препроцессора и, наконец, демонстрирует пример использования

43 // вашего класса.

44 #ifdef SMARRAY1_SCAFFOLD

45 // Директива препроцессора определена в

46 // Options I Project[Compiler[Defines

47 void main()

48 (

49 INT_ARRAY startMeUp( 10);

50 for( unsigned int k = 0;.k<10; k++)

51 // здесь используется операция []

52 startMeUp[k] = k;

53

54 } ,

55 ttendif

В строке 11 инициализируются данные-члены класса. Отдельный элемент dummy используется для хранения и выборки фиктивного значения на случай использования недопустимого индекса. В данном примере фиктивное зна-