在java中如果你这样做
Myobj one = new Myobj();
Myobj two = one;
然后一个和两个指向同一个对象。
在C ++中,如果我这样做:
Myobj one = new Myobj();
Myobj *two = &one;
这与java示例基本相同吗?其中修改one
或two
会影响两个对象吗?
答案 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;