所以在C ++中你可以使用new关键字实例化对象,否则......
Object o = new Object();
但你也可以这样做
Object o = Object();
两者的区别究竟是什么?为什么我会使用另一个呢?
答案 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();