【发布时间】:2012-04-26 18:13:52
【问题描述】:
这行得通:
MyObject *o;
o = new MyObject();
这不是:
MyObject o = new MyObject();
为什么?
【问题讨论】:
-
这就是我想要理解的。 @MPelletier 似乎已经向我解释过了。
标签: c++ object pointers new-operator instantiation
这行得通:
MyObject *o;
o = new MyObject();
这不是:
MyObject o = new MyObject();
为什么?
【问题讨论】:
标签: c++ object pointers new-operator instantiation
因为它们不相等。试试:
MyObject* o = new MyObject();
【讨论】:
关键字newreturns a pointer。它必须分配给一个对象的指针。
这也可以:
MyObject o = MyObject();
编辑:
正如赛斯所说,以上等价于:
MyObject o;
如果没有给出构造函数,则调用默认构造函数(即不带参数)。
【讨论】:
new来实例化一个对象。
new 在堆上分配内存,而不是在程序的栈上。把它想象成指针指向“你的程序之外”的东西。 “新”的东西。
MyObject o = MyObject();并不完全等同于MyObject o;,虽然效果是一样的;前者创建一个默认构造的临时MyObject,然后使用复制构造函数用临时构造初始化o,而后者只是就地默认构造o。如果没有优化,后者通常会更快。
delete what you new”
new,而应该使用make_shared 和家人。)
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();
也是有效的。
【讨论】: