#cpp
Хочу разобраться с вызовом конструктора копирования и оператора присваивания в классе. Правда ли, что здесь вызовется конструктор копирования и только он: SomeClass A = B; А здесь только оператор присваивания: Matrix A, B; A = B; Если так, то чем отличается конструктор копирования от оператора присваивания, почему нельзя заменить один другим и зачем в С++ они разделены?
Ответы
Ответ 1
Задача любого конструктора - создать в сырой неинициализированной памяти объект, которого до этого момента еще не существовало. В общем случае, объект, который "видит" конструктор в начале своей работы, содержит непредсказуемый мусор. Задача конструктора - проинициализировать объект, т.е. придать всем его компонентам осмысленные значения. Оператор присваивания же работает с уже ранее созданным объектом, т.е. с объектом, который уже ранее был полностью сконструирован (каким-то конструктором). Такой объект уже содержит какие-то корректно помещенные в него осмысленные данные. Задача оператора присваивания - заменить эти старые осмысленные данные новыми осмысленными данными, скопированными из объекта-источника (из правой части оператора присваивания). Это две совершенно разные задачи. В общем случае, работа оператора присваивания состоит из двух этапов: корректно убрать из объекта старое содержимое, а затем корректно скопировать в него новое содержимое. Работа же конструктора копирования не имеет первого этапа, ибо никакого старого содержимого в этот момент в объекте нет. То есть упрощенно можно сказать, что конструктор копирования - это "половинка" оператора присваивания.
Комментариев нет:
Отправить комментарий