предоставление оператора присваивания, но без конструктора копирования - PullRequest
0 голосов
/ 21 сентября 2011

Я читаю здесь , что если я не напишу конструктор копирования, компилятор сделает это для меня, используя оператор присваивания, который приводит к мелкой копии объектов. Что делать, если у меня есть оператор присваивания перегружен во всех моих объектах-членах? не приведет ли это к глубокой копии?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

если я не пишу конструктор копирования, компилятор делает это для меня, используя оператор присваивания

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

Что если у меня действительно есть оператор присваивания, перегруженный во всех моих объектах-членах?не приведет ли это к глубокой копии?

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

Прочитайте Правило трех в C ++ 03 и Правило пяти в C ++ 11.

0 голосов
/ 21 сентября 2011

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

  • копировать конструктор копирует элемент за элементом

  • Конструктор перемещения перемещает элемент за элементом

  • копировать присвоение присваивает элемент за элементом

  • переместить назначить перемещение-присваивает элемент за элементом

Эта логика является причиной того, что лучший дизайн - это тот, в котором вы сами не пишете конструктор копирования (или любой из трех других, или деструктора), а вместо этого составляете свой класс хорошо выбранных, одиночных классы ответственности, чья собственная семантика заботится обо всем.

0 голосов
/ 21 сентября 2011

Важной частью в связанной статье является « каждый член класса в отдельности с использованием оператора присваивания».Поэтому не имеет значения, определяете ли вы оператор присваивания для вашего класса, он будет использовать оператор присваивания для каждого члена вашего класса.

...