c ++:新的Object()和Object()之间有什么区别

时间:2011-04-25 04:51:04

标签: c++ oop class object new-operator

所以在C ++中你可以使用new关键字实例化对象,否则......

Object o = new Object();

但你也可以这样做

Object o = Object();

两者的区别究竟是什么?为什么我会使用另一个呢?

3 个答案:

答案 0 :(得分:14)

您不能Object o = new Object(); new运算符返回指向该类型的指针。它必须是Object* o = new Object(); Object实例将位于上。

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

答案 1 :(得分:3)

第一种类型:

Object* o = new Object();

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

第二种类型:

Object o = Object();

使用默认构造函数在堆栈上创建一个对象,然后在o上调用赋值构造函数。大多数编译器将消除赋值调用,但如果在赋值操作中有(预期或其他)副作用,则应考虑到这一点。在不调用赋值操作的情况下实现创建新对象的常规方法是:

Object o; // Calls default constructor

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