Void main ( )

{ My a1 (10); // создается объект, переменная инициализируется 10

My a2 = a1; // с помощью конструктора копирования создаетсяобъект

// a2, со значением переменной 11, т.к. в конструкторе

// инкремент

Print (a1);

/* значение переменной объекта a1 копируется с инкрементом в

в переменную локального объекта obj функции (11 ) и это

значение выводится */

Print (a2);

/* значение переменной объекта a2 копируется с инкрементом в

в переменную локального объекта obj функции (12 ) и это

значение выводится */

a1. ~My(); // вызовом деструктора объект память a1 освобождается

Print (a1); // выведется мусор

Print (a2); // выведется 12

}

Результат:

После вызова деструктора a1 освобождается динамическая память ив данном (*p) – члене объекта a1 содержитсятеперь мусор(операция delete в процессе возврата в систему возвращаемой памяти затирает эту память).

Объект a2 остался неизменным. Так и должно быть.

Если мы удалим из определения класса конструктор копирования, результат работы программы следующий:

Уничтожение объекта a1 привело к уничтожению и его копии a2, в которой находится теперь тот же мусор.

С другой стороны значения переменных теперь выводятся правильно, т.к. конструктор по умолчанию никаких инкрементов естественно не выполняет.

При отсутствии конструктора копирования программа будет использовать конструктор копирования по умолчанию следующего вида:

My (My & obj) { p = obj.p; }

В объекте a1 находится указатель на выделенное обычным конструктором поле памяти.

Побайтовое копирование объекта дает копирование указателя, т.е. в объект a2 заносится тот же самый указатель, оба объекта указывают на один и тот же участок памяти.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: