作业是参考?

时间:2014-10-12 06:24:34

标签: java c++ variable-assignment

在java中如果你这样做

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

下面的代码与Java相同。

Myobj one;
Myobj& two = one;

答案 1 :(得分:2)

他们不一样!

使用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 note &中的变量,一旦分配,它就不能映射到任何其他对象。所以它not太接近Java引用了。

Object& ref2=obj1;      

这里obj1的生命周期在本地范围之后结束。

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

 Object *obj=new Object();

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

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

答案 2 :(得分:2)

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

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

如果你想要两个副本,那么,

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

答案 3 :(得分: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;