2
我有一個關於拷貝構造函數問題,假設一個class A
包含一個int
,使用默認構造函數,拷貝構造函數(?),和構造函數接收int
爲什麼複製構造函數需要是const?
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
參數?
'box1.popf()'返回一個臨時的:
,如果你寫你得到完全相同的問題。 –
如果你說,它必須是恆定的,否。如果你問是否應該,那麼是的。 'cpy ctor'引用同一類的一個對象,並將它的值複製到正在創建的新對象上,只要它不改變'rhs'的值,我們就可以將它傳遞給它const引用 – Raindrop7