作业仅供参考

Assignments are by reference?

本文关键字:仅供参考 作业      更新时间:2023-10-16

在java中,如果您执行

Myobj one = new Myobj();
Myobj two = one;

然后一个和两个指向同一个对象。

在C++中,如果我这样做了:

Myobj one = new Myobj();
Myobj *two = &one;

这与java示例本质上相同吗?其中修改onetwo会影响这两个对象?

下面的代码与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注释&中的变量,一旦赋值,它就不能映射到任何其他对象。所以notJava的引用太接近了。

Object& ref2=obj1;      

这里obj1的生存期在局部作用域之后结束。

当您在cpp中像Object obj一样声明时,实际上是在为一个对象分配空间,而不仅仅是像Java中那样创建引用。在CPP中,指针最接近java中所称的引用。

 Object *obj=new Object();

上面的语句在堆栈以外的内存中创建对象。在使用delete运算符释放内存或关闭应用程序之前,它都有使用寿命。

Java中,所有对象都只在堆中创建。

它们使一个和两个基本上相同:

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;