【问题标题】:C++ Pointers and Object InstantiationC++ 指针和对象实例化
【发布时间】:2012-04-26 18:13:52
【问题描述】:

这行得通:

MyObject *o;
o = new MyObject();

这不是:

MyObject o = new MyObject();

为什么?

【问题讨论】:

  • 这就是我想要理解的。 @MPelletier 似乎已经向我解释过了。

标签: c++ object pointers new-operator instantiation


【解决方案1】:

因为它们不相等。试试:

 MyObject* o = new MyObject();

【讨论】:

    【解决方案2】:

    关键字newreturns a pointer。它必须分配给一个对象的指针。

    这也可以:

    MyObject o = MyObject();
    

    编辑:

    正如赛斯所说,以上等价于:

    MyObject o;
    

    如果没有给出构造函数,则调用默认构造函数(即不带参数)。

    【讨论】:

    • 我明白了!我是在学习Java之后学习C++的,所以我的印象是需要new来实例化一个对象。
    • @Peter,仅当您需要指针时才需要。使用new 在堆上分配内存,而不是在程序的栈上。把它想象成指针指向“你的程序之外”的东西。 “新”的东西。
    • 其实MyObject o = MyObject();并不完全等同于MyObject o;,虽然效果是一样的;前者创建一个默认构造的临时MyObject,然后使用复制构造函数用临时构造初始化o,而后者只是就地默认构造o。如果没有优化,后者通常会更快。
    • @AndreasBrinck 在 C++ 中我们将其更改为“你必须 delete what you new”
    • @PeterWood 是的,但这不是尤达所说的。 (顺便说一句,有了更新的功能,你甚至不应该使用new,而应该使用make_shared 和家人。)
    【解决方案3】:

    new MyObject() 返回一个指向MyObject 类型对象的指针。所以实际上你正在尝试分配一个对象MyObject*(是的,一个指针也可以被认为是一个对象)。因此,您必须声明一个变量 MyObject* 或类似 std::shared_ptr<MyObject> 的兼容变量。

    正确的初始化是

    // in C++03
    MyObject* o(new MyObject());
    
    // in C++11
    MyObject* o {new MyObject()};
    

    作业时

    MyObject* o = new MyObject();
    

    也是有效的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2013-01-22
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      相关资源
      最近更新 更多