【问题标题】:Difference between int i(x); and int i = x; [duplicate]int i(x) 之间的差异;和int i = x; [复制]
【发布时间】:2021-07-31 02:33:25
【问题描述】:
我一直在 HackerRank 中练习 C++。在那里,我看到了不同的提交,并且看到了一些新的东西。
有人在 for 循环中使用了int i(0),例如
for (int i(0), mark; i<q; ++i)
所以我的问题是:
-
int i(x); 和int i = x; 有什么区别? (其中 x 是在这些行之前初始化的 int 类型)。
【问题讨论】:
标签:
c++
default-constructor
variable-initialization
【解决方案1】:
答案本质上是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 个只是引用初始化的语法的名称,而不是初始化过程的发生方式,因为后者取决于初始化对象的类和初始化对象(以及你选择的语法,当然)。