我对复制构造函数有疑问,假设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
参数?
答案 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