9 ответов:
и Java. Они просто не называются неявно, как в C++, и я подозреваю, что это ваш настоящий вопрос.
во-первых, конструктор копирования не более чем:
public class Blah { private int foo; public Blah() { } // public no-args constructor public Blah(Blah b) { foo = b.foo; } // copy constructor }теперь C++ будет неявно вызывать конструктор копирования с помощью следующего оператора:
Blah b2 = b1;клонирование / копирование в этом экземпляре просто не имеет смысла в Java, потому что все b1 и b2 являются ссылками, а не объектами значений, как в C++. В C++ Этот оператор создает копию состояние объекта. В Java он просто копирует ссылка. Состояние объекта не копируется, поэтому неявный вызов конструктора копирования не имеет смысла.
и это все правда.
с Брюс Эккель:
почему [конструктор копирования] работает на C++, а не на Java?
конструктор копирования является основополагающим часть C++, так как он автоматически создает локальную копию объекта. Еще приведенный выше пример доказывает, что это так не работает на Java. Зачем? в Java все, чем мы манипулируем - это ручки, в то время как в C++ можно иметь дескрипторные сущности, и вы также можете пройдите вокруг объектов непосредственно. Вот что такое конструктор копирования C++ для: Когда вы хотите взять объект и передать его по значению, таким образом дублирование объекта. Так что это работает хорошо в C++, но вы должны держать в имейте в виду, что эта схема не работает в Java, так что не используйте его.
(рекомендую прочитать всю страницу-на самом деле, старт здесь вместо.)
Я думаю, что ответ на этот вопрос очень интересен.
во-первых, я считаю, что в Java все объекты находятся в куче, и хотя у вас нет указателей, у вас есть "ссылки". Ссылки имеют копию symantics и java внутренне отслеживает количество ссылок, так что его сборщик мусора знает, что безопасно избавиться.
поскольку вы получаете доступ к объектам только через копируемые ссылки, фактическое количество раз, когда вам нужно скопировать объект, значительно уменьшается (для например, в C++ просто передача объекта функции (по значению) приводит к созданию новых объектов, копируемых, в Java передается только ссылка на объект). Дизайнеры, вероятно, решили, что clone() будет достаточно для остальных применений.
Это только мое мнение (я уверен, что есть оправданный ответ)
конструкторы копирования в C++ в первую очередь полезны, когда вы отправляете или возвращаете экземпляры классов по значению, так как это когда конструктор копирования прозрачно активирован.
поскольку в Java все возвращается по ссылке, а виртуальная машина ориентирована на динамическое распределение, действительно не было оправдания сложностей конструктора копирования.
In кроме того, поскольку все делается по ссылке, разработчику часто приходится предоставлять свою собственную реализацию и решение о том, как клонировать поля.
это напрягает. Когда мелкие копии в порядке, у вас есть [клон()](http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#clone ()) и когда их нет, вам нужно реализовать глубокую копию, как и C++.
Я не очень программист на C++, но я, кажется, помню правило о "трех amigos" - конструктор копирования, оператор присваивания и деструктор. Если у вас есть один, то вам, вероятно, нужны все три.
Так, может быть, без деструктора в языке, они не хотели включать конструктор копирования? Всего лишь предположение.
Ну, это может. Он просто не создается. Если бы мне пришлось угадывать, это, вероятно, связано с тем, что объекты Java всегда в куче.
в C++ конструктор копирования по умолчанию является мелкой копией по элементам. Если класс владеет памятью, выделенной в куче (через необработанный указатель), это приведет к тому, что копия будет совместно использовать внутренние компоненты с оригиналом, что не то, что вы хотите.
представьте на мгновение, что Java имеет такое поведение. Любой класс, который имеет поля это объекты (читай: по существу все они) будут иметь неправильное поведение, и вам нужно будет переопределить его самостоятельно. В 99% случаев вы никого не спасли от неприятностей. Кроме того, вы только что создали тонкую ловушку для себя - представьте, что вы случайно забыли переопределить конструктор копирования по умолчанию. Если он был создан по умолчанию, и вы пытаетесь его использовать, компилятор не будет жаловаться вообще, но ваша программа будет плохо себя вести во время выполнения.
даже если они сделали копию по умолчанию конструктор, который выполняет глубокую копию, я не уверен, что это было бы особенно полезно. Мало того, что вы, как правило, выполняете меньше копий на Java, чем на C++, но вы не всегда хотите глубоко копировать поле.
объекты, которые вы просто владеете, и объекты, на которые вы держите ссылки, потому что они вам нужны, но не несут ответственности, - это одни и те же поля. Собственность и заимствование-это не первоклассные понятия. Для объектов, которыми вы владеете, вы хотите глубоко скопировать их (если они не являются неизменяемыми, в этом случае вы не должны беспокоиться), а для объектов, на которые вы просто держите ссылку, вы хотите скопировать ссылку.
Я бы сказал, что конструктор копирования, который просто бездумно глубоко копирует все, также не подходит для многих классов. Конечно, больше, чем мелкое копирование по умолчанию.
Java есть конструктор копирования
Примечание:вместо demo d2=новая демонстрация (d1) можно писать demo d2=d1
Главное отличие ч / б два
demo d2=новая демонстрация (d1) означает, что новый объект создан, и это выделенная память, но
demo d2=d1 подразумевает, что создается только ссылочная переменная который использует тот же адрес памяти объекта d1 и поэтому d2 не выделено разделяется память.синтаксис конструктора копирования:
Смотрите ниже пример первого конструктора копирования очень прост :))
classname (int datafield) / / простой конструктор
{
этот.datafield=datafield;
}
classname (classname object)
{
свойство datafield=объект.datafield;/ / см. ниже пример
}
Теперь для вызова
{classname obj=new classname ();
имя_класса anotherObject=параметр obj;//или класса anotherObject=новый имя_класса(объект)
}
class demo { private int length; private int breadth; private int radius; demo(int x,int y) { length=x; breadth=y; } int area() { return length*breadth; } //Copy Constructor demo(demo obj) { length=obj.length; breadth=obj.breadth; } public static void main(String args[]) { demo d1=new demo(5,6); demo d2=new demo(d1);//Invokes Copy Constructure System.out.println("Area for d1 object="+d1.area()); System.out.println("Area for d2 object="+d2.area()); } }
Comments