12

当您在 C++ 中创建一个位于堆栈上的新对象时,(我经常看到它的方式)您可以这样做:

CDPlayer player;

当您在堆上创建对象时,您调用new

CDPlayer* player = new CDPlayer();

但是当你这样做时:

CDPlayer player=CDPlayer();

它创建了一个基于堆栈的对象,但它和上面的例子有什么区别?

4

2 回答 2

24

POD 的区别很重要(基本上,所有内置类型,如int,等booldouble以及仅从其他 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 ,则避免初始化分配的对象)。

于 2010-09-17T13:50:31.337 回答
8

当您在 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.
于 2010-09-17T13:52:54.773 回答