可能重复:
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;
答案 0 :(得分:7)
它们是等价的,在这两种情况下都会调用没有参数的ctor。
答案 1 :(得分:3)
对于具有构造函数的 struct
和class
es,它们是相同的,使用空括号的唯一区别是基本类型,如果括号是零,则初始化为零在那里,虽然他们没有被初始化。
实际上,它比那更复杂;如果省略括号:
class
es和struct
是默认初始化的,这实际上意味着他们的构造函数被调用; 相反,如果指定括号,则始终执行默认初始化,对于基本类型,这意味着零初始化。
完整的故事在§5.3.4¶15中解释;默认初始化包含在§8.5。
中相关标准报价:
创建一个新表达式 类型T的对象初始化 对象如下:
- 如果省略new-initializer:
- 如果
T
是(可能是cv认证的)非POD类类型(或 其中的一个对象是 default-initialized(8.5)如果T
是aconst
- 限定类型,底层证券 类类型应具有用户声明的 默认构造函数。- 否则,创建的对象具有不确定的值。如果
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();
它们都具有调用默认构造函数的相同效果。