gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:27:59 25 4
gpt4 key购买 nike

如果“测试”是普通类,则之间是否有任何区别:

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,它对所有字段进行零初始化,因为它的默认ctor是由编译器生成的,而不是由用户定义的。
  • new C-默认初始化C,该C调用默认的ctor。
  • new C()-值初始化C,这将调用默认的ctor。

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

    对于 new B()而言,C++ 98和C++ 03在行为上存在差异。

    这是C++尘土飞扬的角落之一,它会使您发疯。构造对象时,有时您需要/需要parens,有时您绝对不能拥有它们,有时也没有关系。

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

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