其他分享
首页 > 其他分享> > c – 类型名称后的括号是否与new有所不同?

c – 类型名称后的括号是否与new有所不同?

作者:互联网

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

Test* test = new Test;

Test* test = new Test();

解决方法:

让我们变得迂腐,因为存在实际上会影响代码行为的差异.以下大部分内容来自对“Old New Thing” article的评论.

有时新运算符返回的内存将被初始化,有时它不会取决于你正在新建的类型是POD (plain old data),还是它是一个包含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编译器中,应发生以下情况:

>新A – 不确定的价值
> new A() – 零初始化
> new B – 默认构造(B :: m未初始化)
> new B() – 默认构造(B :: m未初始化)
> new C – 默认构造(C :: m为零初始化)
> new C() – 默认构造(C :: m为零初始化)

在符合C 03的编译器中,事情应该像这样工作:

>新A – 不确定的价值
> new A() – value-initialize A,它是零初始化,因为它是POD.
> new B – 默认初始化(离开B :: m未初始化)
> new B() – value-initializes B,它对所有字段进行零初始化,因为它的默认ctor是编译器生成的而不是用户定义的.
> new C – default-initializes C,调用默认的ctor.
> new C() – value-initializes C,调用默认的ctor.

因此,在所有版本的C中,新A和新A()之间存在差异,因为A是POD.

对于新的B(),C 98和C 03之间的行为存在差异.

这是C的尘土飞扬的角落之一,可以让你发疯.在构造一个物体时,有时候你需要/需要它们,有时候你绝对不能拥有它们,有时它们并不重要.

标签:c,constructor,initialization,new-operator,c-faq
来源: https://codeday.me/bug/20190910/1802417.html