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

Листинг 17.3 содержит модифицированные версии определений конструктора копий и операции присваивания класса INT_ARRAY, демонстрирующие примеры развернутого копирования.

h04171.jpg

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 вызывающего объекта, затем выделяется новая область памяти и в нее копируются значения из памяти объекта аргумента.

Конструктор копий и операция присваивания переработанного класса не станут причиной потерь памяти. Общие указания о том, когда какую версию копирования уместно использовать, вы найдете в предыдущем разделе "Буквальное копирование". В разделе "Реализация копирования через присваивание" приведен простой способ реализации конструктора копий. В разделе "Блокирование копирования и присваивания" рассказывается, как