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 |
} |