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)
所以我的问题是:
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
的一个对象(顺便说一下,如果 x
是 int
/A
在 int i(x);
/A i(x);
.
也就是说复制初始化并不是从另一个相同class的对象复制它来构造对象的唯一方法。
还有一点值得注意,在我看来,复制初始化并不一定意味着会调用复制构造函数。如果 class A
有(在复制构造函数 A(A const&)
旁边,如果你愿意的话)构造函数 A(int)
,如果你写 [=25] 就会调用构造函数=].
这就是说,在我看来,您在第一个 link 中列出的 6 种语法的名称并没有真正告诉您发生了什么;同样的事情可能发生在更多的语法上,而不同的事情可能发生在相同的语法上。这 6 个只是指初始化的 语法 的名称,而不是指初始化过程如何发生的名称,因为后者取决于初始化对象的 class 和初始化器对象(以及您选择的语法,当然)。
我一直在 HackerRank 练习 C++。在那里,我看到了不同的提交,并且看到了一些新的东西。
有人在 for 循环中使用了 int i(0)
,例如
for (int i(0), mark; i<q; ++i)
所以我的问题是:
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
的一个对象(顺便说一下,如果 x
是 int
/A
在 int i(x);
/A i(x);
.
也就是说复制初始化并不是从另一个相同class的对象复制它来构造对象的唯一方法。
还有一点值得注意,在我看来,复制初始化并不一定意味着会调用复制构造函数。如果 class A
有(在复制构造函数 A(A const&)
旁边,如果你愿意的话)构造函数 A(int)
,如果你写 [=25] 就会调用构造函数=].
这就是说,在我看来,您在第一个 link 中列出的 6 种语法的名称并没有真正告诉您发生了什么;同样的事情可能发生在更多的语法上,而不同的事情可能发生在相同的语法上。这 6 个只是指初始化的 语法 的名称,而不是指初始化过程如何发生的名称,因为后者取决于初始化对象的 class 和初始化器对象(以及您选择的语法,当然)。