这两个构造函数调用之间的区别

Difference between these two constructor calls

本文关键字:函数调用 之间 区别 两个      更新时间:2023-10-16

可能重复:
类型名称后面的括号与new有区别吗?

我相信这个问题已经被问过了,但我无法通过快速搜索找到它。

Foo ob* = new Foo; 
Foo ob* = new Foo();

这两种在C++中创建对象的方法有区别吗?如果没有,那么其中一种是否被认为是一种不良做法?每个编译器都一视同仁吗?

第一个是默认初始化,第二个是值初始化。如果Foo是类类型,那么它们都会调用默认构造函数。如果Foo是基本的(例如typedef int Foo;(,则默认初始化不执行初始化,而值初始化执行零初始化。

对于类类型和数组,初始化以预期的方式递归地进行到成员/元素。

没有区别,只是如果Foo是内置类型,则前者不会对其进行值初始化。

因此:

new int;   // unspecified value
new int(); // 0

这与内置程序的"正常"分配也很匹配:

int x;     // unspecified value
int x = 0; // well, you can't do `int x()`, but, if you could...