A a1(5)之间有什么区别;和A a2 = A(5)?这两个作品,但我真的想知道它们之间的区别,因为我在我的一个项目中使用了方法2而且我遇到了一个错误,在我改为方法1后修复了。提前感谢!
class A {
public:
int val;
A() : val(0) {}
A(int newVal) : val(newVal) {}
};
int main()
{
A a1(5); // method 1
A a2 = A(5); // method 2
}
答案 0 :(得分:7)
A a1(5); // method 1
A a2 = A(5); // method 2
第一个称为直接初始化,第二个称为复制初始化。
如果您使复制构造函数不可访问或/并且未将其定义为:
,则第二个将无法编译class A {
public:
int val;
A() : val(0) {}
A(int newVal) : val(newVal) {}
private:
A(A const&); //the second one will not compile
};
现在第二个不会编译。请注意,它不会在两种情况下都编译:
private
或protected
)。答案 1 :(得分:1)
严格来说,阅读您的问题我希望您提供这两个例子
A a1(5); // method 1
A a2 = 5; // method 2
第一个是直接初始化。第二个是复制初始化。
你问题中提供的你的例子已经已经说明了两者之间的区别:)
直接初始化通过查找和使用适当的构造函数,直接初始化目标对象,作为单步过程。复制初始化在概念上是一个两步过程:首先,它通过某种转换构造函数构造类型为A
的临时对象,然后使用复制构造函数将其复制到目标对象。即。
A a2 = 5;
实际上将起作用
A a2 = A(5);
这实际上详尽地解释了差异。
第二种变体的两步结构再次是概念性的。允许(并且将)编译器优化第二个变体,使其完全与第一个变体一样。它们将消除中间临时对象并直接执行初始化。