#include?<iostream>
using?namespace?std;
class?classA
{
public:
?int?_number;
?classA(){}
?classA(int?number)
?{
??_number?=?number;
?}
?~classA(){}
?/*??問題出在我自己寫的拷貝構造函數,不加“const”會導致后面的“classA?c?=?a?+?b;”
?以及“return?classA(_number?+=?a._number);”報錯*/?classA(const?classA?&a)?{??_number?=?a._number;?}??classA?operator+(classA?&a)?{??return?classA(_number?+=?a._number);?}};int?main(){?classA?a(1),b(2);?classA?c?=?a?+?b;?cout?<<?c._number?<<?endl;?return?0;}源代碼如上所示,加了const不會報錯,不加const會報錯,為什么?
2 回答

AAnonymous
TA貢獻62條經驗 獲得超31個贊
根本原因是,**右值** 不可以綁定到 **非 const 左值引用**
你這里,ClassA a = b + c;
a是左值,b + c 是計算表達式,它是右值。它只可以綁定到 const 左值引用,或者右值引用(或者說通用引用)。
你這里沒有形參與之匹配的構造函數。
以下兩個都可以:
classA(const?classA?&a);???//?拷貝構造函數 classA(classA?&&a);????????//?移動構造函數
return?classA(_number?+=?a._number);
這句也一樣,classA(number += a._number) 沒有問題,它調用構造函數,但是return,返回的是一個臨時變量,臨時變量是右值。所以它根本return不出來。定義上面任意一個就可以解決了。
(PS,如果把+重載返回定義為右值引用,return是沒有問題了,但是return的右值要拷貝/移動給對象a,又會面臨同樣的問題)

阿臣兒
TA貢獻2條經驗 獲得超1個贊
因為你已經聲明了一個復制構造函數,所以系統不會產生一個默認的復制構造函數,而你寫的復制構造函數括號中是帶const的,所以你調用的時候也要帶上const,你刪掉整個復制構造函數(這樣系統就會產生一個默認的復制構造函數)或者你寫的復制構造函數中的const就不會報錯了,一起學習,一起進步
- 2 回答
- 0 關注
- 2460 瀏覽
添加回答
舉報
0/150
提交
取消