Примечание: мне все равно, на каком языке приводятся примеры. Я задаю этот вопрос с точки зрения C ++ / Java / C #, хотя я думаю, что копирование является независимой от языка концепцией.
Я думаю, это зависит от языка.
В C ++ копирование играет совсем другую роль, чем в Java / C #. В C ++ я не могу вспомнить многих случаев, когда поверхностное копирование имеет смысл. Обычно вы просто создаете ссылки или указатели на объект. Конструкторы копирования обычно реализуют глубокие копии, потому что в C ++ объект становится владельцем своих членов и отвечает за управление их временем жизни. Поскольку нет GC, эта семантика владения становится важной, и вы не можете просто иметь два объекта, указывающие на третий, без особой осторожности (они используют подсчет ссылок для поддержания третьего? владеет это?)
Я бы даже сказал, что различие между «глубокими» и «неглубокими» копиями на самом деле не имеет смысла в C ++. Копия создает все, что необходимо для работы вновь созданного объекта. Иногда он разделяет бит данных (обычно это данные, которые не принадлежат ни одному из объектов), поэтому это может быть не «истинная» глубокая копия », но и не мелкая, потому что большая часть класс копируется .