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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論