【问题标题】:c++: what's the difference between new Object() and Object()c++: new Object() 和 Object() 有什么区别
【发布时间】:2011-08-12 03:05:41
【问题描述】:

所以在 C++ 中,您可以使用 new 关键字或其他方式实例化对象...

Object o = new Object();

但你也可以这样做

Object o = Object();

这两者究竟有什么区别,为什么我要使用一个而不是另一个?

【问题讨论】:

  • 你可以吗?我收到错误:请求从“Object*”转换为非标量类型“Object”。
  • 我不是 C++ 程序员,但我相信 new 关键字会为对象分配内存。
  • 我认为第一行应该是Object *o = new Object();

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


【解决方案1】:

你不能做Object o = new Object(); new 操作符返回一个指向类型的指针。它必须是Object* o = new Object(); Object 实例将在堆上。

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

【讨论】:

  • Object o; 将使用无参数构造函数为您提供堆栈上的对象。 Object o = Object(); 做同样的事情。通常第二种形式用于在将 args 传递给构造函数时在堆栈上创建对象; Object o = Object(x,y,x);
  • 从技术上讲,对象不必在堆栈上,这取决于使用它的上下文(即它可能是动态分配对象的成员)。使用术语堆栈/堆非常类似于 Java,并且与 C++ 并不真正相关。第一个版本返回一个指向dynamic storage duration 对象的指针,第二个版本创建一个临时对象并将其分配给automatic storage duration 对象。
  • 我对上述声明的评论是“堆栈/堆非常类似于 Java,与 c++ 并不真正相关”。在嵌入式系统中,堆栈空间针对速度和内存效率进行了优化,但尺寸更小,通常用于标准类型。堆更大、更慢,通常用于用户定义类型 (UDT)
【解决方案2】:

第一种:

Object* o = new Object();

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

第二种:

Object o = Object();

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

Object o; // Calls default constructor

【讨论】:

    【解决方案3】:

    我正在搜索类似上面的问题,但有变化,所以我将在这里添加我的问题

    我注意到 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();
    

    【讨论】:

      猜你喜欢
      • 2014-02-10
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 2018-06-20
      相关资源
      最近更新 更多