gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:13 28 4
gpt4 key购买 nike

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

Test* test = new Test;

Test* test = new Test();

最佳答案

让我们学究气点,因为有些差异实际上会影响代码的行为。以下大部分内容摘自对 "Old New Thing" article 的评论.

有时 new 运算符返回的内存会被初始化,有时不会,这取决于您要更新的类型是否为 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 编译器中,应该发生以下情况:

  • 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,调用默认 ctor。

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

所以在所有版本的 C++ 中,new Anew A() 之间是有区别的,因为 A 是一个 POD。

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

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

关于c++ - 类型名称后的括号是否与 new 有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3103019/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com