【问题标题】:What is the difference between "default initialization" (`new C`) and "value initialization" (`new C()`)? [duplicate]“默认初始化”(`new C`)和“值初始化”(`new C()`)有什么区别? [复制]
【发布时间】:2020-12-26 15:38:38
【问题描述】:

这两种说法有什么区别?

C *c1 = new C;
C *c2 = new C();

情况解释hereMichael Burr的回答):

  • new C - 默认初始化 C,它调用默认 ctor。
  • new C() - 值初始化 C,调用默认 ctor。

我不明白其中的区别。术语“默认初始化”和“值初始化”是什么意思?可以举个例子吗?

【问题讨论】:

  • 好的,但是正如 Michael 在源问题中所言,default-initializesvalue-initializes 有什么区别?
  • @Daros911 如果C 是类/结构类型,则两种语法都调用其默认构造函数。但是如果C 是基本类型,比如int,那么new int 将不指定int 的值,但new int() 会将int 的值初始化为0。这就是区别
  • @RemyLebeau 如果类/结构有一个普通的构造函数,它也会被未初始化。

标签: c++ initialization


【解决方案1】:

不同之处在于当您使用“可简单构造”的对象时,这意味着类型实际上没有构造函数,也没有其成员/基类(包括内置类型,如 intdouble )。我们来看一个例子:

struct Foo
{
    int val1;
    int val2;
};

这里Foo 没有构造函数。当我们创建Foo 类型的对象时,我们可以让其成员初始化为不确定的值。以下是我们的做法:

Foo* pf = new Foo;

这里pf->val1pf->val2 本质上是一些垃圾值。
我们也可以像这样zero-initialize那个对象:

Foo* pf = new Foo();

这里pf->val1pf->val2 被初始化为零。如果它们有不同的类型,比如指针,它们就会有不同的值,比如空指针。

如果对象确实有一个默认构造函数,这两个例子做的事情完全一样。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2014-03-16
    • 2010-12-09
    相关资源
    最近更新 更多