问题描述
我一直在 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 其中
从显式的构造函数参数集初始化一个对象。
而 int i = x;
是 copy initialization,其中
从另一个对象初始化一个对象
(以下内容可能与 int
无关,因此将其作为对实际类的两种语法差异的评论:A i(x);
vs A i = x;
。)
请注意,这两种语法都可能导致调用复制构造函数:如果类 A
存在复制构造函数,则可以通过以下方式提供显式构造函数参数集 直接初始化可以只包含一个 A
类的对象(顺便说一下,如果 x
是一个 int
/A
在 int i(x);
/A i(x);
中。
这就是说复制初始化并不是从同一个类的另一个对象复制一个对象的唯一方法。
在我看来,还有一点值得注意,复制初始化并不一定意味着会调用复制构造函数。如果类 A
有(除了复制构造函数 A(A const&)
,如果你喜欢)构造函数 A(int)
,如果你写 A a = 3;
,它就是将被调用的构造函数。
所有这些都是说,在我看来,您在我提供的第一个链接中找到的 6 种语法的名称并没有真正告诉您会发生什么;更多的语法可能会发生同样的事情,而相同的语法可能会发生不同的事情。这 6 个只是引用初始化的语法的名称,而不是初始化过程是如何发生的,因为后者取决于初始化对象的类和初始化对象(以及你选择的语法,当然)。