ClassName变量(arg1)之间的区别;和ClassName变量= ClassName(arg1);

时间:2013-11-04 17:00:11

标签: c++

你如何称呼这两种不同的方式,它们有何不同?

ClassName variable(arg1); 

ClassName variable = ClassName(arg1);

2 个答案:

答案 0 :(得分:5)

ClassName variable(arg1); 

这是直接初始化。假设它是类类型,则通过将参数传递给合适的构造函数来初始化对象。如果没有合适的构造函数,则会出错。

ClassName variable = ClassName(arg1);

这是 copy-initialisation 。从概念上讲,它创建并直接初始化临时;然后通过复制或移动临时来初始化变量。如果没有合适的移动或复制构造函数,则会出错。

实际上,复制或移动可能会被省略,因此结果将与直接初始化相同 - 除非必须仍有可访问的移动或复制构造函数,即使它实际上并未使用。

答案 1 :(得分:2)

case 1:
ClassName variable(arg1); 
//will initialize variable directly with the type constructor

case 2:
ClassName variable = ClassName(arg1); 
//should initialize variable directly with a copy of the rvalue
//however because of RVO optimiziation this is tha same as case 1

RVO是编译器的优化,它删除了对构造/复制/销毁的不必要的调用,在这种情况下它们是相同的。