在C++中,int x=1和int x(1)有什么区别?

6

可能是重复问题:
在C++中,复制初始化和赋值初始化有区别吗?

我是C++的新手,很少看到人们使用这种语法来声明和初始化变量:

int x(1);

我尝试过,编译器没有报错,输出结果与int x=1相同,它们实际上是一样的吗?

非常感谢你们。


2
重复:https://dev59.com/PHNA5IYBdhLWcg3wNa-T - Mehrdad Afshari
不完全相同。这个问题似乎特别涉及POD的初始化。 - Boojum
3个回答

13

是的,对于内置类型而言,int x = 1;int x(1); 是相同的。

当构造类类型对象时,这两种不同的初始化语法略有不同。

Obj x(y);

这是直接初始化,它指示编译器查找一个可以接受y或可以隐式转换为y的构造函数,并使用此构造函数初始化x。

Obj x = y;

这是复制初始化,指导编译器通过转换y来创建一个临时的Obj对象,并使用Obj的复制构造函数初始化x

复制初始化y的类型与x相同时等同于直接初始化

对于复制初始化,由于使用的临时对象是隐式转换的结果,因此标记为explicit的构造函数不会被考虑。构造类型的复制构造函数必须可访问,但编译器可能将复制本身作为优化而消除。


值得一提的是,Obj x; x = y; 产生了另一种变化。在这种情况下,x将被默认构造。然后,在下一条语句中,赋值运算符将被调用。 - Daniel Yankowsky
3
值得注意的另一件事是,允许像int这样的纯数据类型以类构造函数调用的语法进行初始化,可以使模板透明地处理POD和类类型。 - Boojum
1
@Boojum: 在C++语言中添加该功能旨在提供一种单一的初始化对象的方式,使得可以在初始化列表内对任何类型的对象进行初始化。这对我来说比在模板内部进行初始化更重要(和常见),后者可以用'Type object = other_object'语法来解决。 - David Rodríguez - dribeas

1

对于 POD 类型,这两个语句是相同的。


0

我不是C++专家,但如果它产生相同的结果,那有什么关系呢?我猜如果你真的感兴趣,你可以编译(但不汇编)你的代码,看看差异在哪里。

编辑:正如其他地方提到的,对于内置类型来说,它们确实是相同的。


4
当然很重要。你可能会看到相同的结果,但这只是意味着你不知道要寻找哪些副作用或者不知道所有可能导致不同结果的边缘情况。这是一个初学者/中级程序员非常合理的问题。 - mob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接