当你在C ++中创建一个存在于堆栈中的新对象时(我大多看到它的方式)你会这样做:
CDPlayer player;
在堆上创建对象时,请调用new
:
CDPlayer* player = new CDPlayer();
但是当你这样做时:
CDPlayer player=CDPlayer();
它会创建一个基于堆栈的对象,但它与顶级示例之间的区别是什么?
答案 0 :(得分:22)
差异对于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,则避免初始化已分配的对象。)
答案 1 :(得分: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.
答案 2 :(得分:0)
CDPlayer* player = new CDPlayer();
这实际上是在堆栈上创建一个指针并使其指向堆上分配的CDPlayer对象。