




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第C++實例分析講解臨時對象與右值引用的用法目錄1.什么是臨時變量2.右值引用2.1概念2.2代碼實現(xiàn)2.3C++11新特性之移動構(gòu)造2.3.1移動構(gòu)造函數(shù)的介紹2.3.2代碼實現(xiàn)
1.什么是臨時變量
在棧上定義對象時,當(dāng)只調(diào)用類中的構(gòu)造函數(shù)時,編譯器將在棧上創(chuàng)建一個臨時對象,這個臨時對象沒有地址。所以他的生命周期非常短。短到下一行代碼就被直接析構(gòu)了。
代碼驗證
#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)在我們來分析結(jié)果,首先這是一個拷貝構(gòu)造,拷貝構(gòu)造指的是用一個已經(jīng)初始化的值,去初始化另一個沒有初始化的值,前兩行的構(gòu)造都是臨時變量的構(gòu)造,然后開始拷貝構(gòu)造,拷貝構(gòu)造完成之后,立馬對兩個臨時構(gòu)造進行析構(gòu),這個就證明了當(dāng)只調(diào)用類中的構(gòu)造函數(shù)時,編譯器將在棧上創(chuàng)建一個臨時對象,最后一個析構(gòu)是拷貝構(gòu)造的析構(gòu)。
像這種情況我們就無法使用這個臨時變量,我們可以通過const常引用的方式來解決,我們都知道,我們無法直接inta=100,無法直接引用一個常量,這個時候我們可以constinta=100;所以,我們用這個方法來實現(xiàn)一下,代碼如下:
但是這個時候我們會發(fā)現(xiàn),常引用只能引用常函數(shù),所以我們還必須把引用的函數(shù)加上const,但是這個在工作過程中,基本上是不現(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()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é)果圖:
雖然我們得到了這樣一個結(jié)果圖,但是這是不方便得,所以我們就引出來了右值引用。
注意:此時B()已經(jīng)不是一個臨時變量了,他有了地址,所以,現(xiàn)在這個就相當(dāng)于
//相當(dāng)于constAa=B();
inttemp=B的地址,把B的地址進行保存。注意這個是在棧上。
//可能有些人會這么理解
B*b=newB;
Aa=std::move(*(b));
a.show_info();
//但是我們注意了右值引用不能用在堆上,并且這種寫法肯定也是不對的
成為了多態(tài)的一個條件了。
2.右值引用
2.1概念
左值:有地址的量就是左值。
右值:沒有地址量就是右值。
右值引用的語法形式:
右值引用類型引用變量=常量或臨時對象
2.2代碼實現(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了,也是我們工作開發(fā)中常用的。
注意:我在這個代碼里面寫了兩個可以調(diào)用多態(tài)的方法,第二個方法,如果一個右值想引用一個左值時,必須使用std::mover函數(shù),此時如果不加A,相當(dāng)于一個拷貝構(gòu)造。
2.3C++11新特性之移動構(gòu)造
2.3.1移動構(gòu)造函數(shù)的介紹
1.首先我們討論一下移動構(gòu)造函數(shù)的優(yōu)缺點,有了移動構(gòu)造我們就不用再開辟新的空間,提高了效率,但是也有它的缺點,缺點就是這玩意不是很安全,我們可以在這個里面修改這個值,可能會導(dǎo)致一些問題。
2.就是我們可能會想為什么我們不能把這個移動構(gòu)造的邏輯直接,加入到拷貝構(gòu)造中呢,只需要把const直接去掉不就一樣的了麻,但是如果我們把const去掉之后,我們other就不能是個常數(shù)了,這樣就導(dǎo)致了缺點,所以,移動構(gòu)造函數(shù)是拷貝函數(shù)的一個優(yōu)化補充。
2.3.2代碼實現(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的移動構(gòu)造"endl;
~
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 烘培活動充值活動方案
- 煙臺工會活動方案
- 廣西創(chuàng)新驅(qū)動管理辦法
- 造價咨詢合同管理辦法
- 省屬事業(yè)屬地管理辦法
- 禁毒案件屬地管理辦法
- 外籍人員用餐管理辦法
- 維修質(zhì)量風(fēng)險管理辦法
- 電廠燃料采購管理辦法
- 后勤職工培訓(xùn)課件
- 太極拳理論考試復(fù)習(xí)題
- 《水利水電工程白蟻實時自動化監(jiān)測預(yù)警系統(tǒng)技術(shù)規(guī)范》
- 2024年湖北省中考英語試卷
- GB/T 15316-2024節(jié)能監(jiān)測技術(shù)通則
- 科創(chuàng)板股票開戶知識測評題庫及答案
- 幼兒園食堂舉一反三自查報告
- 光伏分布式項目日報模板
- 蘇科版九年級物理上冊一課一測-11.1杠桿
- 中試平臺管理制度
- 診斷學(xué)題庫(附答案)
- 重要概念一胎產(chǎn)式胎兒身體縱軸與母體縱軸之間的關(guān)系
評論
0/150
提交評論