В Java, если вы делаете
Myobj one = new Myobj();
Myobj two = one;
Тогда один и два указывают на один и тот же объект.
В C ++, если я сделал:
Myobj one = new Myobj();
Myobj *two = &one;
Это по сути то же самое, что и пример Java? При этом изменение либо one
или же two
повлияет на оба объекта?
Они делают одно и два в основном одно и то же:
Myobj *one = new Myobj();
Myobj *two = one;
//one and two are the same thing, pointer's to a Myobj
Myobj one;
Myobj *two = &one;
//one is an object that will be deallocated at end of current scope
//two is a pointer to one
В C ++ new Myobj()
создает Myobj
в куче и возвращает указатель на него.
Myobj *one; //Creates a variable that should point to a Myobj instance
Myobj two = new Myobj(); //Doesn't really work
*two = &one; //Get where two point's at and assign the location of one to it
Обновить:
Myobj one = new Myobj(); //This doesn't quite work, assigning pointer to class
Myobj *two = &one; //This works, you make a pointer to point to one
Чтобы исправить ваше первое утверждение, вы можете использовать:
Myobj one = Myobj();
//Myobj one(); //This requires the constructor to take arguments, thanks juanchopanza!
Myobj one{}; //Requires C++11, courtesy juanchopanza
Myobj one;
Все делают одно и то же
Как правило, следующее должно сделать копию:
Myobj one; //or any variant
Myobj two = one;
Или, если вы предпочитаете использовать указатели:
Myobj *one = new Myobj();
Myobj *two = new Myobj();
*two = *one;
код тезисов ниже такой же, как Java.
Myobj one;
Myobj& two = one;
Приведенный ниже код указывает одну и две точки на одно и то же местоположение, т. Е. Изменение любого из них приведет к их изменению
yobj *one = new Myobj();
Myobj *two = one;
Если вы хотите, чтобы два были его копией,
Myobj *one = new Myobj();
Myobj *two = new Myobj();
*two = *one;
Они не одинаковы!
Объекты, созданные с new
Ключевое слово сохраняется даже после локальной области видимости. Им выделяется хранилище в куче. И они возвращают ссылку, поэтому вам нужен указатель для хранения значения ссылки.
Объекты созданы
without
new
Ключевое слово следует за семантикой копирования. Это если у вас есть
Object obj1=Object()
Object obj2=obj1;
два объекта будут созданы. То есть значения свойств obj1 копируются в obj2.
Если вы не хотите создавать новый объект, вы должны использовать указатели.
Пример:
Object obj1=Object()
Object *obj1ref=&obj1; //this is like assigning reference in java
Ниже инструкция иллюстрирует переменную в заметке cpp &
в объявлении он не может быть сопоставлен с каким-либо другим объектом после назначения. Так что это not
слишком близко к Java
Рекомендации.
Object& ref2=obj1;
Здесь obj1 имеет время жизни, которое заканчивается после локальной области видимости.
Когда вы объявляете как объект obj в cpp, вы фактически выделяете пространство для одного объекта, а не просто создаете ссылку, как в Java
, В CPP
, указатели ближе всего к тому, что вы называете ссылками в Java.
Object *obj=new Object();
Выше оператор создает объект в памяти, кроме стека. У него есть время жизни, пока вы не освободите память, используя delete
оператор или пока приложение не закрыто.
В Java
Все объекты создаются только в куче.