第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

拷貝構(gòu)造函數(shù),不加const會報錯,為什么?

拷貝構(gòu)造函數(shù),不加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(){} ?/*??問題出在我自己寫的拷貝構(gòu)造函數(shù),不加“const”會導(dǎo)致后面的“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貢獻(xiàn)62條經(jīng)驗 獲得超31個贊

根本原因是,**右值** 不可以綁定到 **非 const 左值引用**

你這里,ClassA a = b + c;

a是左值,b + c 是計算表達(dá)式,它是右值。它只可以綁定到 const 左值引用,或者右值引用(或者說通用引用)。

你這里沒有形參與之匹配的構(gòu)造函數(shù)。

以下兩個都可以:

classA(const?classA?&a);???//?拷貝構(gòu)造函數(shù)
classA(classA?&&a);????????//?移動構(gòu)造函數(shù)


return?classA(_number?+=?a._number);

這句也一樣,classA(number += a._number) 沒有問題,它調(diào)用構(gòu)造函數(shù),但是return,返回的是一個臨時變量,臨時變量是右值。所以它根本return不出來。定義上面任意一個就可以解決了。

(PS,如果把+重載返回定義為右值引用,return是沒有問題了,但是return的右值要拷貝/移動給對象a,又會面臨同樣的問題)

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

TA貢獻(xiàn)2條經(jīng)驗 獲得超1個贊

因為你已經(jīng)聲明了一個復(fù)制構(gòu)造函數(shù),所以系統(tǒng)不會產(chǎn)生一個默認(rèn)的復(fù)制構(gòu)造函數(shù),而你寫的復(fù)制構(gòu)造函數(shù)括號中是帶const的,所以你調(diào)用的時候也要帶上const,你刪掉整個復(fù)制構(gòu)造函數(shù)(這樣系統(tǒng)就會產(chǎn)生一個默認(rèn)的復(fù)制構(gòu)造函數(shù))或者你寫的復(fù)制構(gòu)造函數(shù)中的const就不會報錯了,一起學(xué)習(xí),一起進(jìn)步

查看完整回答
反對 回復(fù) 2018-12-04
  • 2 回答
  • 0 關(guān)注
  • 2431 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號