使用C ++构造函数的不同方法

时间:2012-06-22 04:20:01

标签: c++ constructor

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
}

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
};

现在第二个不会编译。请注意,它不会在两种情况下都编译:

  • 如果复制构造函数已定义但无法访问(privateprotected)。
  • 如果声明了复制构造函数,但未定义。

答案 1 :(得分:1)

严格来说,阅读您的问题我希望您提供这两个例子

A a1(5);  // method 1
A a2 = 5; // method 2

第一个是直接初始化。第二个是复制初始化。

你问题中提供的的例子已经已经说明了两者之间的区别:)

直接初始化通过查找和使用适当的构造函数,直接初始化目标对象,作为单步过程。复制初始化在概念上是一个两步过程:首先,它通过某种转换构造函数构造类型为A的临时对象,然后使用复制构造函数将其复制到目标对象。即。

A a2 = 5;

实际上将起作用

A a2 = A(5);

这实际上详尽地解释了差异。

第二种变体的两步结构再次是概念性的。允许(并且将)编译器优化第二个变体,使其完全与第一个变体一样。它们将消除中间临时对象并直接执行初始化。