Почему конструкторы копирования не нужны для неизменяемых объектов? - PullRequest
8 голосов
/ 11 марта 2010

Почему конструкторы копирования не нужны для неизменяемых объектов? Пожалуйста, объясни мне это.

Ответы [ 4 ]

11 голосов
/ 11 марта 2010

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

4 голосов
/ 11 марта 2010

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

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

Неизменяемые объекты неизменны. Нет смысла создавать копию объекта, который не изменится.

Теперь давайте снова поговорим о жизни. В таких языках, как C ++, конструкторы копирования также позволяют обходить проблемы с памятью и временем жизни. Например, если я пишу API, который занимает SomeType*, и я хочу сохранить его дольше, чем время жизни моего метода. В C ++ самый надежный способ сделать это - создать копию объекта с помощью конструктора копирования.

2 голосов
/ 11 марта 2010

Это зависит от языка:

Однако для многих языков требуется конструктор копирования. Если вы его не предоставите, язык сгенерирует его неявно.

Однако с неизменяемым объектом это обычно нормально, поскольку конструктор копирования по умолчанию (обычно) делает поверхностную копию всех значений. С изменяемым типом данных (т. Е. Содержащим ссылки на внутренние объекты на другие объекты) поверхностное копирование обычно является плохим выбором, поскольку копия копирует только ссылку / указатель, инкапсулированный в нем.

1 голос
/ 11 марта 2010

это так естественно, потому что значение неизменяемого объекта не может быть изменено.

...