一尘不染

类型名称后的括号是否与new有区别?

cpp

如果“测试”是一个普通类,那么以下两者之间是否有任何区别:

Test* test = new Test;

and

Test* test = new Test();

阅读 156

收藏
2022-06-29

共1个答案

一尘不染

让我们学究一点,因为有一些差异实际上会影响代码的行为。以下大部分内容摘自对一篇“新旧事物”文章的评论。
有时,新操作符返回的内存将被初始化,有时则不取决于您要更新的类型是POD(纯旧数据),还是包含POD成员并使用编译器生成的默认构造函数的类。
在C1998中,有两种类型的初始化:零和默认
在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为零初始化)

在符合C03的编译器中,情况应该是这样的:
new A-不确定值
new A()-值initialize A,这是零初始化,因为它是一个POD。
new B-默认初始化(使B::m未初始化)
new B()-value初始化B,该值为零初始化所有字段,因为它的默认ctor是编译器生成的,而不是用户定义的。
new C-default初始化C,它调用默认的ctor。
new C()-value初始化C,它调用默认的ctor。
因此,在所有版本的C
中,new a和new a()之间都有区别,因为a是一个POD。
对于case new B(),C98和C03之间的行为有所不同。
这是C++的一个尘土飞扬的角落,会让你发疯。在构建一个对象时,有时你想要/需要paren,有时你绝对不能拥有它们,有时这并不重要。

2022-06-29