C++.Бархатный путь


Конструктор копирования


Если определить переменную основного типа и присвоить ей значение, то выражение, состоящее из имени переменной, получит соответствующее значение. Имя означенной переменной можно расположить справа от знака операции присвоения. В результате выполнения этой операции присвоения, леводопустимое выражение окажется равным значению ранее объявленной и проинициализированной нами переменной. Произойдёт копирование значений объектов.

int iVal1; int iVal2; iVal1 = 100; iVal2 = iVal1;

Это нам давно известно. Это тривиально. Менее тривиальным оказывается результат выполнения операции присвоения для объектов-представителей класса.

Вернёмся к старой версии конструктора (её проще повторно воспроизвести, чем описывать словами) и снова модифицируем main процедуру нашей программы. Мы определяем новый объект, используем операцию присвоения и наблюдаем за результатами:

ComplexType() { real = 0.0; imag = 0.0; CTcharVal = 0; x = 0; cout << "Здесь ComplexType() конструктор!" << endl; } ::::: void main() { ComplexType CDw1; ComplexType CDw2 = CDw1; cout << "(" << CDw1.real << ", " << CDw1.imag << "i)" << endl; cout << (int)CDw1.CTcharVal << ", " << CDw1.x << "…" << endl; cout << "(" << CDw2.real << ", " << CDw2.imag << "i)" << endl; cout << (int)CDw2.CTcharVal << ", " << CDw2.x << "…" << endl; }

Наша программа состоит из двух операторов определения, один из которых содержит описатель-инициализатор, и двух пар операторов вывода, которые сообщают о состоянии новорожденных объектов.

В программе определяется два объекта. Можно предположить, что у этих объектов окажутся одинаковые значения данных-членов. Было бы странно, если бы результат операции присвоения для основных типов по своему результату отличался бы от операции присвоения для данных производных типов.

Действительно, судя по поступающим сообщениям, оба объекта успешно были созданы и существуют с одинаковыми значениями данных-членов. При этом мы имеем дело с разными объектами, которые располагаются по разным адресам. В этом можно убедиться, если добавить оператор вывода в конец функции main: if (&CDw1 != &CDw2) cout << "OK!" << endl; /* Сообщить о разных адресах.*/




- Начало -  - Назад -  - Вперед -