类型名称后面的括号与新的有什么不同?

如果'测试'是一个普通的类,是否有任何区别:

Test* test = new Test;

Test* test = new Test();

让我们讨厌,因为实际上会影响代码行为的差异。 以下大部分内容摘自对“旧新事物”文章的评论。

有时,新运算符返回的内存将被初始化,有时它不会取决于新建的类型是POD(普通旧数据),还是包含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 ++的尘土飞扬的角落之一,可以让你发疯。 当构建一个对象时,有时候你想要/需要这些对象,有时你绝对不能拥有它们,有时候并不重要。


    new Thing(); 明确表示你想要一个叫做new Thing;的构造函数new Thing; 被认为暗示你不介意构造函数没有被调用。

    如果在具有用户定义的构造函数的struct / class上使用,则没有区别。 如果调用一个简单的结构/类(例如struct Thing { int i; }; )然后new Thing; 就像malloc(sizeof(Thing));new Thing(); 就像calloc(sizeof(Thing)); - 它初始化为零。

    这个问题在于:

    struct Thingy {
      ~Thingy(); // No-longer a trivial class
      virtual WaxOn();
      int i;
    };
    

    new Thingy;的行为new Thingy; vs new Thingy(); 在这种情况下在C ++ 98和C ++ 2003之间进行了更改。 请参阅Michael Burr对如何和为什么的解释。


    不,他们是一样的。 但是有一点区别:

    Test t;      // create a Test called t
    

    Test t();   // declare a function called t which returns a Test
    

    这是因为基本的C ++(和C)规则:如果某件事可能是一个声明,那么它就是一个声明。

    编辑:关于POD和非POD数据的初始化问题,虽然我同意所有的说法,但我只想指出,这些问题仅适用于新的或构造的东西没有用户定义的构造函数。 如果有这样的构造函数,它将被使用。 对于99.99%明智设计的类,将会有这样的构造函数,所以这些问题可以被忽略。

    链接地址: http://www.djcxy.com/p/6929.html

    上一篇: Do the parentheses after the type name make a difference with new?

    下一篇: C# Design Problem Regarding Data Encapsulation