2014-10-12 83 views
0

在java中,如果你做作业通过参考?

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

那么一,两个都指向同一个对象。

在C++中,如果我做:

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

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

+1

不,这不能编译:'two'应该声明'MyObj中*',然后就去做一个' =两个;'。您也可以在C++中使用引用。 – quantdev 2014-10-12 06:30:45

+0

@quantdev嗯,我实际上不需要'one = two',但是当我初始化'two'时,我希望它是'one'的副本。然后我可以稍后编辑'two'。我做得对吗? – penu 2014-10-12 06:32:20

+0

@ user1008134其中一个当前是指向无的指针 – Winestone 2014-10-12 06:33:11

回答

1

这些使得一个和两个基本上相同的事情:

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; 
+0

对不起,我问这个问题很糟糕,但是什么才是合适的将'one'复制到'two'而不使它们成为相同变量的方法。 – penu 2014-10-12 06:39:06

+0

@ user1008134 udpated – Winestone 2014-10-12 06:40:27

+0

只是为了澄清,您的最后两个代码片段会创建两个单独的对象,每个对象具有相同的内容,但修改其中一个或另一个不会影响另一个对象? – penu 2014-10-12 06:46:33

2

论文下面的代码是一样的Java。

Myobj one; 
Myobj& two = one; 
2

它们是不一样的!

使用new关键字创建的对象即使在本地作用域之后仍然存在。它们分配在堆中的存储。他们返回一个引用,所以你需要一个指针来存储参考值。

对象创建

withoutnew关键字后续复制语义。也就是说,如果您有

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的生命周期在本地范围之后结束。

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

Object *obj=new Object(); 

上面的语句在堆栈以外的内存中创建对象。它有一段时间,直到您使用delete运算符释放内存或直到应用程序关闭。

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

2

下面的代码使一个和两个指向同一位置,即改变或者将改变他们两个。

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

如果你希望两个是一个接着一个副本,

Myobj *one = new Myobj(); 
Myobj *two = new Myobj(); 
*two = *one; 
+0

谢谢ravi,这有助于 – penu 2014-10-12 06:46:58

+0

@ user1008134欢迎队友 – ravi 2014-10-12 06:47:57