亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

拷貝構造函數,不加const會報錯,為什么?

拷貝構造函數,不加const會報錯,為什么?

C++
Rimas 2018-11-30 12:35:33
#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,又會面臨同樣的問題)

查看完整回答
反對 回復 2018-12-07
?
阿臣兒

TA貢獻2條經驗 獲得超1個贊

因為你已經聲明了一個復制構造函數,所以系統不會產生一個默認的復制構造函數,而你寫的復制構造函數括號中是帶const的,所以你調用的時候也要帶上const,你刪掉整個復制構造函數(這樣系統就會產生一個默認的復制構造函數)或者你寫的復制構造函數中的const就不會報錯了,一起學習,一起進步

查看完整回答
反對 回復 2018-12-04
  • 2 回答
  • 0 關注
  • 2460 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號