




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法目錄1.什么是臨時(shí)變量2.右值引用2.1概念2.2代碼實(shí)現(xiàn)2.3C++11新特性之移動(dòng)構(gòu)造2.3.1移動(dòng)構(gòu)造函數(shù)的介紹2.3.2代碼實(shí)現(xiàn)
1.什么是臨時(shí)變量
在棧上定義對(duì)象時(shí),當(dāng)只調(diào)用類中的構(gòu)造函數(shù)時(shí),編譯器將在棧上創(chuàng)建一個(gè)臨時(shí)對(duì)象,這個(gè)臨時(shí)對(duì)象沒(méi)有地址。所以他的生命周期非常短。短到下一行代碼就被直接析構(gòu)了。
代碼驗(yàn)證
#includeiostream
usingnamespacestd;
classA
public:
cout"A的構(gòu)造"endl;
virtual~A()
cout"A的析構(gòu)"endl;
A(constAother)
cout"A的拷貝構(gòu)造"endl;
virtualvoidshow_info()
cout"我是父親"endl;
classB:publicA
public:
cout"B的構(gòu)造"endl;
~B()
cout"B的析構(gòu)"endl;
voidshow_info()
cout"我是父親"endl;
intmain()
Aa=B();
a.show_info();
return0;
}
結(jié)果圖:
如圖所示,現(xiàn)在我們來(lái)分析結(jié)果,首先這是一個(gè)拷貝構(gòu)造,拷貝構(gòu)造指的是用一個(gè)已經(jīng)初始化的值,去初始化另一個(gè)沒(méi)有初始化的值,前兩行的構(gòu)造都是臨時(shí)變量的構(gòu)造,然后開(kāi)始拷貝構(gòu)造,拷貝構(gòu)造完成之后,立馬對(duì)兩個(gè)臨時(shí)構(gòu)造進(jìn)行析構(gòu),這個(gè)就證明了當(dāng)只調(diào)用類中的構(gòu)造函數(shù)時(shí),編譯器將在棧上創(chuàng)建一個(gè)臨時(shí)對(duì)象,最后一個(gè)析構(gòu)是拷貝構(gòu)造的析構(gòu)。
像這種情況我們就無(wú)法使用這個(gè)臨時(shí)變量,我們可以通過(guò)const常引用的方式來(lái)解決,我們都知道,我們無(wú)法直接inta=100,無(wú)法直接引用一個(gè)常量,這個(gè)時(shí)候我們可以constinta=100;所以,我們用這個(gè)方法來(lái)實(shí)現(xiàn)一下,代碼如下:
但是這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn),常引用只能引用常函數(shù),所以我們還必須把引用的函數(shù)加上const,但是這個(gè)在工作過(guò)程中,基本上是不現(xiàn)實(shí),也是不方便的。
#includeiostream
usingnamespacestd;
classA
public:
cout"A的構(gòu)造"endl;
virtual~A()
cout"A的析構(gòu)"endl;
A(constAother)
cout"A的拷貝構(gòu)造"endl;
virtualvoidshow_info()const
cout"我是父親"endl;
classB:publicA
public:
cout"B的構(gòu)造"endl;
~B()
cout"B的析構(gòu)"endl;
voidshow_info()const
cout"我是父親"endl;
intmain()
constAa=B();
a.show_info();
return0;
}
結(jié)果圖:
雖然我們得到了這樣一個(gè)結(jié)果圖,但是這是不方便得,所以我們就引出來(lái)了右值引用。
注意:此時(shí)B()已經(jīng)不是一個(gè)臨時(shí)變量了,他有了地址,所以,現(xiàn)在這個(gè)就相當(dāng)于
//相當(dāng)于constAa=B();
inttemp=B的地址,把B的地址進(jìn)行保存。注意這個(gè)是在棧上。
//可能有些人會(huì)這么理解
B*b=newB;
Aa=std::move(*(b));
a.show_info();
//但是我們注意了右值引用不能用在堆上,并且這種寫法肯定也是不對(duì)的
成為了多態(tài)的一個(gè)條件了。
2.右值引用
2.1概念
左值:有地址的量就是左值。
右值:沒(méi)有地址量就是右值。
右值引用的語(yǔ)法形式:
右值引用類型引用變量=常量或臨時(shí)對(duì)象
2.2代碼實(shí)現(xiàn)
#includeiostream
usingnamespacestd;
classA
public:
cout"A的構(gòu)造"endl;
virtual~A()
cout"A的析構(gòu)"endl;
A(constAother)
cout"A的拷貝構(gòu)造"endl;
virtualvoidshow_info()
cout"我是父親"endl;
classB:publicA
public:
cout"B的構(gòu)造"endl;
~B()
cout"B的析構(gòu)"endl;
voidshow_info()
cout"我是父親"endl;
intmain()
Aa=B();
a.show_info();
//也可以使用,
Aa1=std::move(a);
a.show_info();
return0;
}
結(jié)果圖:
用了右值引用我們就可以不用在加const了,也是我們工作開(kāi)發(fā)中常用的。
注意:我在這個(gè)代碼里面寫了兩個(gè)可以調(diào)用多態(tài)的方法,第二個(gè)方法,如果一個(gè)右值想引用一個(gè)左值時(shí),必須使用std::mover函數(shù),此時(shí)如果不加A,相當(dāng)于一個(gè)拷貝構(gòu)造。
2.3C++11新特性之移動(dòng)構(gòu)造
2.3.1移動(dòng)構(gòu)造函數(shù)的介紹
1.首先我們討論一下移動(dòng)構(gòu)造函數(shù)的優(yōu)缺點(diǎn),有了移動(dòng)構(gòu)造我們就不用再開(kāi)辟新的空間,提高了效率,但是也有它的缺點(diǎn),缺點(diǎn)就是這玩意不是很安全,我們可以在這個(gè)里面修改這個(gè)值,可能會(huì)導(dǎo)致一些問(wèn)題。
2.就是我們可能會(huì)想為什么我們不能把這個(gè)移動(dòng)構(gòu)造的邏輯直接,加入到拷貝構(gòu)造中呢,只需要把const直接去掉不就一樣的了麻,但是如果我們把const去掉之后,我們other就不能是個(gè)常數(shù)了,這樣就導(dǎo)致了缺點(diǎn),所以,移動(dòng)構(gòu)造函數(shù)是拷貝函數(shù)的一個(gè)優(yōu)化補(bǔ)充。
2.3.2代碼實(shí)現(xiàn)
#includeiostream
usingnamespacestd;
classA
int*a;
public:
A():a(newint[1024])
cout"A的構(gòu)造"endl;
A(constAother)
a=newint[1024];
memcpy(this-a,other.a,sizeof(int[1024]));
A(Aother)
this-a=other.a;
other.a=nullptr;
cout"A的移動(dòng)構(gòu)造"endl;
~
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高一生生物必修一試題及答案
- 多媒體應(yīng)用設(shè)計(jì)師考試常見(jiàn)誤區(qū)試題及答案
- 2025關(guān)于物流服務(wù)委托合同范文
- 小學(xué)校隊(duì)籃球摸底測(cè)試題及答案
- 系統(tǒng)分析師考試常見(jiàn)題型試題及答案
- 2025公寓租賃合同模板示例
- 培訓(xùn)師測(cè)試試題及答案
- 沙河教招歷年試題及答案
- 社會(huì)工作者與政府的關(guān)系中級(jí)考試試題及答案
- 系統(tǒng)集成項(xiàng)目的投資回報(bào)評(píng)估試題及答案
- DBJ50-T-078-2016重慶市城市道路工程施工質(zhì)量驗(yàn)收規(guī)范
- 《基于STAMP的航空安全理論與實(shí)踐》課件-第2章
- 庭院綠化養(yǎng)護(hù)方案
- 一例胃癌患者的個(gè)案護(hù)理
- 【MOOC】《電工技術(shù)》(北京科技大學(xué))中國(guó)大學(xué)MOOC慕課答案
- 政府專職消防文員筆試考試題庫(kù)(含答案)
- 2025屆內(nèi)蒙古鄂爾多斯市康巴什區(qū)鄂爾多斯一中高考考前模擬數(shù)學(xué)試題含解析
- 經(jīng)營(yíng)高危險(xiǎn)性體育項(xiàng)目游泳申請(qǐng)表
- 小學(xué)低年級(jí)識(shí)字教學(xué)策略研究三篇
- 在線學(xué)習(xí)新變革課件 2024-2025學(xué)年人教版(2024)初中信息技術(shù)七年級(jí)全一冊(cè)
- 膀胱癌教學(xué)課件
評(píng)論
0/150
提交評(píng)論