在C ++中,以下代码如何工作?

时间:2011-05-04 17:29:15

标签: c++

  

可能重复:
  Do the parentheses after the type name make a difference with new?

以下代码执行哪些操作:

Test *t1 = new Test; // there is no () after new Test;

如果有用户声明的默认构造函数

这个怎么样:

Test *t2 = new Test(); // there is () after new Test;

3 个答案:

答案 0 :(得分:7)

它们是等价的,在这两种情况下都会调用没有参数的ctor。

答案 1 :(得分:3)

对于具有构造函数的structclass es,它们是相同的,使用空括号的唯一区别是基本类型,如果括号是零,则初始化为零在那里,虽然他们没有被初始化。

实际上,它比那更复杂;如果省略括号:

  • 非POD class es和struct是默认初始化的,这实际上意味着他们的构造函数被调用;
  • POD(特别是原始类型)未初始化;

相反,如果指定括号,则始终执行默认初始化,对于基本类型,这意味着零初始化。

完整的故事在§5.3.4¶15中解释;默认初始化包含在§8.5。


相关标准报价:

  

创建一个新表达式   类型T的对象初始化   对象如下:

     
      
  • 如果省略new-initializer:   
        
    • 如果T是(可能是cv认证的)非POD类类型(或   其中的一个对象是   default-initialized(8.5)如果T是a   const - 限定类型,底层证券   类类型应具有用户声明的   默认构造函数。
    •   
    • 否则,创建的对象具有不确定的值。如果T是   const - 合格的类型,或者(可能是   cv-qualified)POD类类型(或数组   含有(直接或   间接的)成员   const-qualified类型,程序是   不良形成的;
    •   
  •   
  • 如果new-initializer的格式为(),则默认初始化   应执行(8.5);
  •   
  • 如果new-initializer的格式为(expression-list),T为a   类类型,合适   构造函数被调用,使用   expression-list作为参数   (8.5);
  •   
  • 如果new-initializer的格式为(expression-list),而T为   算术,枚举,指针或   指向成员的类型和   表达式列表恰好包含一个   表达式,那么对象就是   初始化为(可能   转换)表达式的值   (8.5); - 否则新表达式   是不正确的。
  •   

(§5.3.4¶15)

答案 2 :(得分:0)

它会自动调用默认构造函数。你也可能会遇到这些:

Test t1;
Test t3 = Test();

它们都具有调用默认构造函数的相同效果。