c++;:什么';这是新对象()和对象()之间的区别 在C++中,可以使用new关键字实例化对象,或者以其他方式… Object o = new Object();

c++;:什么';这是新对象()和对象()之间的区别 在C++中,可以使用new关键字实例化对象,或者以其他方式… Object o = new Object();,c++,oop,class,object,new-operator,C++,Oop,Class,Object,New Operator,但你也可以这样做 Object o = Object(); 两者的区别到底是什么?为什么我要使用其中一个 你不能做objecto=newobject()new运算符返回指向该类型的指针。它必须是Object*o=newobject()对象实例将位于堆上 Object o=Object()将在堆栈上创建一个Object实例。我的C++是生锈的,但是我相信,尽管这看起来像是一个创建,然后是一个赋值,但实际上它只是作为一个构造函数调用。 你不能做对象o =新对象()。code>new运算符返回指向该

但你也可以这样做

Object o = Object();

两者的区别到底是什么?为什么我要使用其中一个

你不能做
objecto=newobject()
new运算符返回指向该类型的指针。它必须是
Object*o=newobject()
对象实例将位于堆上


Object o=Object()
将在堆栈上创建一个
Object
实例。我的C++是生锈的,但是我相信,尽管这看起来像是一个创建,然后是一个赋值,但实际上它只是作为一个构造函数调用。

你不能做<代码>对象o =新对象()。code>new运算符返回指向该类型的指针。它必须是
Object*o=newobject()
对象实例将位于堆

Object o=Object()
将在堆栈上创建一个
Object
实例。我的C++是生锈的,但是我相信,尽管这看起来像是一个创建,然后是一个赋值,但实际上它只是作为一个构造函数调用。

第一种类型:

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

第二类:

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

Object o; // Calls default constructor
第一类:

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

第二类:

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

Object o; // Calls default constructor

我一直在寻找一个类似于上面的问题,但有一些变化,所以我将在这里添加我的问题

我注意到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();
类对象
{
公众:
x=0;

void display(){std::cout我正在搜索一个类似上面的问题,但有一些变化,所以我将在这里添加我的问题

我注意到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();
类对象
{
公众:
x=0;

虚空显示(){STD::Cutou.??我可能会出错:从“对象*”转换为非标量类型“对象”请求。我不是C++程序员,但我相信新< /Cord>关键字分配对象的内存。我相信第一行应该是代码>对象*O=新对象()。我可以得到错误:从“对象*”转换为非标量类型的“对象”请求。我不是C++程序员,但我相信新< /Cord>关键字分配对象的内存。我相信第一行应该是代码>对象*O=新对象()。
对象o的可能副本;
将使用无参数构造函数在堆栈上为您提供一个对象。
Object o=Object();
做同样的事情。当您将参数传递给构造函数时,通常使用第二种形式在堆栈上创建一个对象;
对象o=Object(x,y,x)
从技术上讲,对象不必在堆栈上,它取决于使用它的上下文(即它可能是动态分配对象的成员)使用术语堆栈/堆是非常类似java的,而不是真正与C++相关的。第一个版本返回一个指向“代码>动态存储持续时间< /CODE的对象的指针”。第二个版本创建一个临时对象并将其分配给一个代码“>自动存储持续时间< /代码>的对象。“堆栈/堆非常类似Java,与c++不太相关”。在嵌入式系统中,堆栈空间针对速度和内存效率进行了优化,但其大小较小,通常用于std类型。堆更大、更慢,通常用于用户定义类型(UDT)
Object o;
将使用无参数构造函数在堆栈上为您提供一个对象。
Object o=Object();
执行相同的操作。通常,当您将参数传递给构造函数时,第二种形式用于在堆栈上创建对象;
Object o=Object(x,y,x)
从技术上讲,对象不必在堆栈上,它取决于使用它的上下文(即它可能是动态分配对象的成员)使用术语堆栈/堆是非常类似java的,而不是真正与C++相关的。第一个版本返回一个指向“代码>动态存储持续时间< /CODE的对象的指针”。第二个版本创建一个临时对象并将其分配给一个“代码>对象:自动存储持续时间< /代码>。堆栈/堆非常类似Java,与c++不太相关。在嵌入式系统中,堆栈空间针对速度和内存效率进行了优化,但其大小较小,通常用于std类型。堆更大、更慢,通常用于用户定义类型(UDT)