为什么复制构造函数需要是const?

时间:2016-11-11 21:53:40

标签: c++ c++11 constructor

我对复制构造函数有疑问,假设class A包含int,默认构造函数,复制构造函数(?)和接收int的构造函数

class A {
  int value;
public:
  A(): value(0) {}                  // Default
  A(A& copy): value(copy.value) {}  // Copy (?)
  A(const int n): value(n) {}       // Receives an int for 'value'

  int get_value() { return value; } // Return value
};

包含A pointer的类,名为BoxForA

class BoxForA {
  A *obj;
public:
  BoxForA(): obj(nullptr) {}
  BoxForA(const int a) { obj = new A(a); }

  A popf(){ return *obj; }  // Returns the content of obj_A (an A element)
};

主要(将打印三个3):

int main() {
  A a(3);
  A b = a;  // Calling copy constructor for b (this works with non-const parameter)

  BoxForA box1(3);
  A c = box1.popf();  // Calling copy constructor for c (this doesn't work with non-const parameter)

  cout << "a = " << a.get_value() << endl;
  cout << "b = " << b.get_value() << endl;
  cout << "c = " << c.get_value() << endl;
  return 0;
}

编译时,编译器给了我这个错误:

error: invalid initialization of non-const reference of type ‘A&’ from an rvalue of type ‘A’
   A c = box1.popf();
                  ^

就是这样,我想我的复制构造函数需要const参数,而不是非const,所以编辑我的复制构造函数如下:

A(const A& obj): value(obj.value) {}

我的程序现在编译没有错误并显示此输出:

a = 3
b = 3
c = 3

尼斯!我找到了解决方案:D ....不,因为我不知道它为什么会起作用。

你能告诉我为什么会这样吗?为什么复制构造函数似乎有const参数?

1 个答案:

答案 0 :(得分:5)

写作时

A c = box1.popf();

它会调用复制构造函数,如您所知:

A c(box1.popf()); // copy constructor

现在,popf会返回什么?它返回A prvalue (基本上是一个右值 - 在C ++ 11中有区别)。但是等等,复制构造函数采用&,它只绑定到左值,所以你的代码不能编译。

但是当你添加const时,签名现在是const&,它接受​​rvalues和lvalues,并且代码会编译。

如果你写的话,你会得到完全相同的问题:

int& a = 1; // 1 is a prvalue, but a only accepts lvalues