小编典典

类型名称后的括号是否与 new 不同?

all

如果’Test’是一个普通的类,有什么区别:

Test* test = new Test;

Test* test = new Test();

阅读 100

收藏
2022-02-28

共1个答案

小编典典

让我们变得迂腐,因为存在实际上会影响代码行为的差异。以下大部分内容来自对“旧新事物”文章的评论。

有时 new 运算符返回的内存将被初始化,有时它不会取决于您要更新的类型是POD还是包含
POD 成员的类并且正在使用编译器生成的默认构造函数。

  • 在 C++1998 中有两种类型的初始化:零和默认
  • 在 C++2003 中,添加了第三种初始化类型,即值初始化。

认为:

struct A { int m; }; // POD
struct B { ~B(); int m; }; // non-POD, compiler generated default ctor
struct C { C() : m() {}; ~C(); int m; }; // non-POD, default-initialising m

在 C++98 编译器中,应发生以下情况:

  • new A - 不确定的价值
  • new A()- 零初始化

  • new B - 默认构造(B::m 未初始化)

  • new B()- 默认构造(B::m 未初始化)

  • new C - 默认构造(C::m 是零初始化的)

  • new C()- 默认构造(C::m 是零初始化的)

在符合 C++03 的编译器中,事情应该是这样的:

  • new A - 不确定的价值
  • new A() - value-initialize A,它是零初始化,因为它是一个 POD。

  • new B - 默认初始化(使 B::m 未初始化)

  • new B() - value-initializes B,它将所有字段初始化为零,因为它的默认 ctor 是编译器生成的,而不是用户定义的。

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

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

因此,在所有版本的 C++ 中,和之间存在差异new Anew A()因为 A 是 POD。

对于 case ,C98 和 C03 之间的行为存在差异new B()

这是 C++ 尘土飞扬的角落之一,会让你发疯。构造对象时,有时您想要/需要括号,有时您绝对不能拥有它们,有时这无关紧要。

2022-02-28