Глава 17. Конструкторы: копирование и присваивание__________________477
Листинг 17.3 содержит модифицированные версии определений конструктора копий и операции присваивания класса INT_ARRAY, демонстрирующие примеры развернутого копирования.
35 |
// Конструктор копий с развернутым копированием |
36 |
INTARRAY::INTARRAY(Const INTARRAYS rhs) |
37 |
( |
38 |
delete [] data; • ' |
39 |
max = rhs.max; |
40 |
dummy = rhs.dummy; |
41 |
data = new int [dummy]; |
42 |
for( unsigned int j = 0; j<dummy; j++). |
43 |
datatj] = rhs.data[j]; |
44 |
} |
45 |
// Операция присваивания с развернутым копированием |
46 |
INTARRAY& INTARRAY::operator-( const INTARRAY&rhs) |
47 |
{ |
48 |
if( this == srhs) return *this; |
49 |
// Обратите внимание, что код идентичен тому, |
|
/'/ что используется в конструкторе копий |
50 |
delete [] data; |
51 |
max = rhs.max; |
52 |
dummy = rhs.dummy; |
53 |
data = new int [dummy] ; |
54 |
for( unsigned int j = 0; j<dummy; j++) |
55 |
datatj] = rhs. data[j]; |
56 |
return *this; |
57 |
) |
Замечание
! Класс целочисленного массива написан исключительно в учебных целях и для практического применения интереса не представляет.
Обратите внимание, что строки 38—43 конструктора копий и строки 50—55 операции присваивания идентичны: освобождается область памяти, адресуемая указателем data вызывающего объекта, затем выделяется новая область памяти и в нее копируются значения из памяти объекта аргумента.
Конструктор копий и операция присваивания переработанного класса не станут причиной потерь памяти. Общие указания о том, когда какую версию копирования уместно использовать, вы найдете в предыдущем разделе "Буквальное копирование". В разделе "Реализация копирования через присваивание" приведен простой способ реализации конструктора копий. В разделе "Блокирование копирования и присваивания" рассказывается, как