Классы являются ссылочными типами по дизайну.Они не должны передаваться по значению.Точно так же с Java и C #.Однако, в отличие от Java и C #, D также имеет полноценные определяемые пользователем типы значений, так как имеет структуры (в C # тоже есть структуры, но они намного более ограничены).Тот факт, что C ++ объединяет эти две причины, вызывает проблемы, такие как срезы объектов .
Теперь, очевидно, бывают случаев, когда вы хотите скопировать ссылочный тип.Решение этой проблемы - клонирование .Вы даете своему классу функцию clone
, которая возвращает копию объекта, к которому она обращена.Таким образом, вы можете скопировать его, когда вам нужно, и он будет скопирован только тогда, когда вам это нужно.Java и C # имеют стандартную функцию clone
, которую реализует большинство типов, но по какой-то причине D не имеет.Я не уверен почему.Но все равно достаточно легко самостоятельно объявить такую функцию для своих типов.Это просто не будет на Object
, что позволило бы вам использовать его практически на любом объекте класса, не заботясь о том, каким был реальный тип, как вы можете делать в Java и C #.Вместо этого вы всегда можете создать конструктор копирования, если хотите, но он менее гибок, потому что вы должны знать тип копируемого объекта, тогда как с clone
это может быть любой тип, производный от типа, clone
возвращает (что будет Object
в случае Java и C #, но будет тем, что вы решите в D, так как функция нестандартная).