474 Часть III. Современное программирование на C++

33

// Здесь не только два указателя ссылаются на один и тот же

34

// блок памяти, но и, кроме того, не освобождается

35

// старый блок.

36

INTARRAY::INT ARRAY(const INTARRAY& rhs)

37

{

38

this->max = rhs.max;

39

this->duimny = rhs.dummy;

40

this->data = rhs.data; // ОШИБКА: буквальное копирование

41

}

42

// -- Предупреждение - И здесь та же ошибка

43

INTARRAY& INTARRAY::operator=( const INTARRAYsrhs)

44

{ • . .

45

if( this =^ srhs) return *this;

46

this->max = rhs.max;

47

this->dummy = rhs.dummy;

48

this->data = rhs.data;

49

return *this;

50

}

51

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

52

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

53

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

54

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

55

{

56

// защита выключена, если NDEBUG определена

57

assert( index < max) ;

58

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

59

}

60

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

61

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

62

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

63

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

64

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

65

ttifdef SMARRAY2SCAFFOLD

66

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

67

// Options¦Project 1 Compiler 1 Defines

68

ftinclude <iostream.h>

69

void main()

70

{

71

INTARRAY ouch;

72

// Создается искусственная область видимости,

73

// чтобы деструктор startMeUp был вызван первым

74

;

75

. INT ARRAY startMeUp( 10);

76

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

77

// здесь работает operator[]

78

startMeUp[k] = k;

79

// Вызов "ПЛОХОЙ" операции присваивания

80

ouch = startMeUp;

81

}