Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

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

#cpp


Хочу разобраться с вызовом конструктора копирования и оператора присваивания в классе. 

Правда ли, что здесь вызовется конструктор копирования и только он:

SomeClass A = B;


А здесь только оператор присваивания:

Matrix A, B;
A = B;


Если так, то чем отличается конструктор копирования от оператора присваивания, почему
нельзя заменить один другим и зачем в С++ они разделены?
    


Ответы

Ответ 1



Задача любого конструктора - создать в сырой неинициализированной памяти объект, которого до этого момента еще не существовало. В общем случае, объект, который "видит" конструктор в начале своей работы, содержит непредсказуемый мусор. Задача конструктора - проинициализировать объект, т.е. придать всем его компонентам осмысленные значения. Оператор присваивания же работает с уже ранее созданным объектом, т.е. с объектом, который уже ранее был полностью сконструирован (каким-то конструктором). Такой объект уже содержит какие-то корректно помещенные в него осмысленные данные. Задача оператора присваивания - заменить эти старые осмысленные данные новыми осмысленными данными, скопированными из объекта-источника (из правой части оператора присваивания). Это две совершенно разные задачи. В общем случае, работа оператора присваивания состоит из двух этапов: корректно убрать из объекта старое содержимое, а затем корректно скопировать в него новое содержимое. Работа же конструктора копирования не имеет первого этапа, ибо никакого старого содержимого в этот момент в объекте нет. То есть упрощенно можно сказать, что конструктор копирования - это "половинка" оператора присваивания.

Комментариев нет:

Отправить комментарий