2016-11-11 101 views
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參數?

+0

'box1.popf()'返回一個臨時的:

,如果你寫你得到完全相同的問題。 –

+0

如果你說,它必須是恆定的,否。如果你問是否應該,那麼是的。 'cpy ctor'引用同一類的一個對象,並將它的值複製到正在創建的新對象上,只要它不改變'rhs'的值,我們就可以將它傳遞給它const引用 – Raindrop7

回答

5

當你寫

A c = box1.popf(); 

它調用拷貝構造函數,如你所知:

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

現在有哪些呢popf回報呢?它返回一個A,一個prvalue(基本上是一個右值 - 在C++ 11中有所不同)。但是等等,拷貝構造函數需要一個&,它只綁定到左值,所以你的代碼不能編譯。

但是,當您添加const時,簽名現在爲const&,它接受右值和左值並且編譯代碼。 - 它只能被「綁定」到一個const引用

int& a = 1; // 1 is a prvalue, but a only accepts lvalues 
相關問題