6

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

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

int x(1);

我试过了,编译器没有报错,输出和 int x=1 一样,它们真的是一回事吗?

非常感谢大家。

4

3 回答 3

13

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

在构造类类型的对象时,两种不同的初始化语法有细微的不同。

Obj x(y);

这是直接初始化,并指示编译器搜索一个明确的构造函数,该构造函数采用yy可以隐式转换为的东西,并使用此构造函数来初始化 x。

Obj x = y;

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

当 的类型与的类型相同时,复制初始化相当于直接初始化yx

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

于 2009-10-03T06:38:38.813 回答
1

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

于 2009-10-03T06:37:37.490 回答
0

我不是 C++ 专家,但如果它给出相同的结果,这有关系吗?我想如果你真的感兴趣,你可以编译(但不汇编)你的代码,看看有什么区别。

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

于 2009-10-03T06:36:03.160 回答