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