C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法_第1頁(yè)
C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法_第2頁(yè)
C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法_第3頁(yè)
C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法_第4頁(yè)
C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論