类型名称后面的括号与 new 有区别吗?

2024-03-17

如果“Test”是普通类,那么以下之间有什么区别:

Test* test = new Test;

and

Test* test = new Test();

让我们变得迂腐一些,因为有些差异实际上会影响代码的行为。以下大部分内容摘自对《旧新事物》文章的评论

有时 new 运算符返回的内存会被初始化,有时则不会,具体取决于您要新建的类型是否是POD(普通旧数据) https://stackoverflow.com/questions/146452/what-are-pod-types-in-c,或者如果它是包含 POD 成员并且使用编译器生成的默认构造函数的类。

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

Assume:

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()- 值初始化 A,它是零初始化,因为它是 POD。

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

  • new B()- 值初始化 B,它对所有字段进行零初始化,因为它的默认构造函数是编译器生成的而不是用户定义的。

  • new C- 默认初始化 C,它调用默认构造函数。

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

所以在 C++ 的所有版本中,之间存在差异new A and new A()因为A是一个POD。

对于这种情况,C++98 和 C++03 之间的行为存在差异new B().

这是 C++ 中能让你发疯的尘土飞扬的角落之一。当构造一个对象时,有时你想要/需要括号,有时你绝对不能拥有它们,有时它并不重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型名称后面的括号与 new 有区别吗? 的相关文章

随机推荐