当您在 C++ 中创建一个位于堆栈上的新对象时,(我经常看到它的方式)您可以这样做:
CDPlayer player;
当您在堆上创建对象时,您调用new
:
CDPlayer* player = new CDPlayer();
但是当你这样做时:
CDPlayer player=CDPlayer();
它创建了一个基于堆栈的对象,但它和上面的例子有什么区别?
当您在 C++ 中创建一个位于堆栈上的新对象时,(我经常看到它的方式)您可以这样做:
CDPlayer player;
当您在堆上创建对象时,您调用new
:
CDPlayer* player = new CDPlayer();
但是当你这样做时:
CDPlayer player=CDPlayer();
它创建了一个基于堆栈的对象,但它和上面的例子有什么区别?
POD 的区别很重要(基本上,所有内置类型,如int
,等bool
,double
以及仅从其他 POD 构建的类 C 结构和联合),默认初始化和值初始化之间存在差异。对于 POD,一个简单的
T obj;
将obj
保持未初始化,而T()
默认初始化对象。所以
T obj = T();
是确保对象正确初始化的好方法。
这在模板代码中特别有用,其中T
可能是 POD 或非 POD 类型。当您知道这T
不是 POD 类型时,T obj;
就足够了。
附录:你也可以写
T* ptr = new T; // note the missing ()
T
(如果是 POD ,则避免初始化分配的对象)。
当您在 C++ 中创建一个位于堆栈上的新对象时,(...) 您可以这样做:
CDPlayer player;
不一定在栈上:以这种方式声明的变量具有自动存储。他们实际去哪里取决于。它可能在堆栈上(特别是当声明在方法内部时),但也可能在其他地方。
考虑声明在类内部的情况:
class foo {
int x;
};
现在的存储x
是存储类实例的地方。如果它存储在堆上,那么也是x
:
foo* pf = new foo(); // pf.x lives on the heap.
foo f; // f.x lives where f lives, which has (once again) automatic storage.