2011-04-25 30 views
1

所以在C++中,你可以使用new关键字或其他实例化对象之间的区别...C++:有什么新的对象()和对象()

Object o = new Object(); 

,但你也可以做

Object o = Object(); 

这两者之间的差异究竟是什么,为什么我会用另一种呢?

+7

你可以吗?我得到错误:从'Object *'转换为非标量类型'Object'请求。 – 2011-04-25 04:54:13

+0

我不是C++程序员,但我相信'new'关键字为对象分配内存。 – Craige 2011-04-25 04:55:00

+3

我相信第一行应该是'Object * o = new Object();' – mdec 2011-04-25 04:55:30

回答

14

您不能这样做Object o = new Object();new运算符返回一个指向该类型的指针。它必须是Object* o = new Object();Object实例将在

Object o = Object()将在上创建一个Object实例。我的C++是生锈的,但我相信即使这个天真的看起来像一个创建后跟一个赋值,它实际上只会作为构造函数调用完成。

+0

[堆和堆栈内存之间的差异](http://stackoverflow.com/questions/408670/stack-static-and-heap-in-c) – mdec 2011-04-25 04:58:19

+0

'对象o;'会使用no-arg构造函数给你一个堆栈上的对象。 'Object o = Object();'做同样的事情。通常,第二种形式用于在将args传递给构造函数时在堆栈上创建对象; '对象o =对象(x,y,x);' – 2011-04-25 05:06:14

+0

从技术上讲,对象不需要在堆栈上,它依赖于它使用的上下文(即它可能是动态分配对象的成员)。使用术语堆栈/堆是非常Java的,并且与C++无关。第一个版本返回一个指向“动态存储持续时间”对象的指针,第二个版本创建一个临时对象并将其分配给“自动存储持续时间”对象。 – 2011-04-25 07:42:00

3

第一类:

Object* o = new Object(); 

将在堆上创建一个新的对象和地址分配邻。这只会调用默认的构造函数。完成后,您将不得不手动释放与该对象关联的内存。

第二式:

Object o = Object(); 

将创建使用默认构造堆栈上的对象,然后调用邻分配构造。大多数编译器将消除转让呼叫,但如果您在转让操作中有(预期或其他)副作用,则应考虑到这一点。常规的方式来实现创建一个新的对象,而不必调用分配操作:

Object o; // Calls default constructor 
0

我正在寻找像上面但变化的问题,所以我会在这里补充我的问题

我注意到差异在visual studio 2015编译器和gcc v4.8.5中。

class Object 
{ 
public: 
x=0; 
void display(){ std::cout<<" value of x: "<<x<<"\n";} 
}; 

Object *o = new Object; 
o->display(); // this gives garbage to this->x , uninit value in visualstudio compiler and //in linux gcc it inits this->x to 0 

Object *o = new Object(); // works well 
o->display();