int i(x); 之间的区别和 int i = x;

Difference between int i(x); and int i = x;

我一直在 HackerRank 练习 C++。在那里,我看到了不同的提交,并且看到了一些新的东西。 有人在 for 循环中使用了 int i(0),例如

for (int i(0), mark; i<q; ++i)

所以我的问题是:

  1. int i(x);int i = x; 有什么区别? (其中 x 是在这些行之前初始化中定义的 int 类型)。

答案本质上是here

int i(x);direct initialization 其中

Initializes an object from explicit set of constructor arguments.

int i = x;copy initialization

Initializes an object from another object

(以下可能与 int 无关,因此将其作为对实际 classes 的两种语法差异的评论:A i(x); vs A i = x; .)

注意,这两种语法都可能导致调用复制构造函数:如果 class A 存在复制构造函数,则 显式构造函数参数集 您可以通过 直接初始化提供的 可以仅包含 class A 的一个对象(顺便说一下,如果 xint/Aint i(x);/A i(x);.

也就是说复制初始化并不是从另一个相同class的对象复制它来构造对象的唯一方法。

还有一点值得注意,在我看来,复制初始化并不一定意味着会调用复制构造函数。如果 class A 有(在复制构造函数 A(A const&) 旁边,如果你愿意的话)构造函数 A(int),如果你写 [=25] 就会调用构造函数=].

这就是说,在我看来,您在第一个 link 中列出的 6 种语法的名称并没有真正告诉您发生了什么;同样的事情可能发生在更多的语法上,而不同的事情可能发生在相同的语法上。这 6 个只是指初始化的 语法 的名称,而不是指初始化过程如何发生的名称,因为后者取决于初始化对象的 class 和初始化器对象(以及您选择的语法,当然)。