2014-10-12 123 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