最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法

 更新時(shí)間:2022年08月16日 10:51:49   作者:lhb2998658795  
對(duì)性能來(lái)說(shuō),許多的問(wèn)題都需要和出現(xiàn)頻率及本身執(zhí)行一次的開(kāi)銷掛鉤,有些問(wèn)題雖然看似比較開(kāi)銷較大,但是很少會(huì)執(zhí)行到,那也不會(huì)對(duì)程序有大的影響;同樣一個(gè)很小開(kāi)銷的函數(shù)執(zhí)行很頻繁,同樣會(huì)對(duì)程序的執(zhí)行效率有很大影響。本章中作者主要根據(jù)臨時(shí)對(duì)象來(lái)闡述這樣一個(gè)觀點(diǎ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)證

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A的構(gòu)造"<<endl;
    }
    virtual ~A()
    {
        cout<<"A的析構(gòu)"<<endl;
    }
    A(const A& other)
    {
        cout<<"A的拷貝構(gòu)造"<<endl;
    }
    virtual void show_info()
    {
        cout<<"我是父親"<<endl;
    }
};
class B:public A
{
public:
    B()
    {
        cout<<"B的構(gòu)造"<<endl;
    }
    ~B()
    {
        cout<<"B的析構(gòu)"<<endl;
    }
    void show_info()
    {
        cout<<"我是父親"<<endl;
    }
};
int main()
{
    A a=B();
    a.show_info();
    return 0;
}

結(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ú)法直接int &a=100,無(wú)法直接引用一個(gè)常量,這個(gè)時(shí)候我們可以const int &a=100;所以,我們用這個(gè)方法來(lái)實(shí)現(xiàn)一下,代碼如下:

但是這個(gè)時(shí)候我們會(huì)發(fā)現(xiàn),常引用只能引用常函數(shù),所以我們還必須把引用的函數(shù)加上const,但是這個(gè)在工作過(guò)程中,基本上是不現(xiàn)實(shí),也是不方便的。

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A的構(gòu)造"<<endl;
    }
    virtual ~A()
    {
        cout<<"A的析構(gòu)"<<endl;
    }
    A(const A& other)
    {
        cout<<"A的拷貝構(gòu)造"<<endl;
    }
    virtual void show_info()const
    {
        cout<<"我是父親"<<endl;
    }
};
class B:public A
{
public:
    B()
    {
        cout<<"B的構(gòu)造"<<endl;
    }
    ~B()
    {
        cout<<"B的析構(gòu)"<<endl;
    }
    void show_info()const
    {
        cout<<"我是父親"<<endl;
    }
};
int main()
{
    const A& a=B();
    a.show_info();
    return 0;
}

結(jié)果圖:

雖然我們得到了這樣一個(gè)結(jié)果圖,但是這是不方便得,所以我們就引出來(lái)了右值引用。

注意:此時(shí)B()已經(jīng)不是一個(gè)臨時(shí)變量了,他有了地址,所以,現(xiàn)在這個(gè)就相當(dāng)于

    //相當(dāng)于const A& a=B();
    int temp=&B的地址,把B的地址進(jìn)行保存。注意這個(gè)是在棧上。
    //可能有些人會(huì)這么理解
    B* b=new B;
    A&& a=std::move(*(b));
    a.show_info();
    //但是我們注意了右值引用不能用在堆上,并且這種寫(xiě)法肯定也是不對(duì)的

成為了多態(tài)的一個(gè)條件了。

2.右值引用

2.1概念

左值:有地址的量就是左值。

右值:沒(méi)有地址量就是右值。

右值引用的語(yǔ)法形式:

右值引用類型&& 引用變量 = 常量或臨時(shí)對(duì)象

2.2代碼實(shí)現(xiàn)

#include <iostream>
using namespace std;
class A
{
public:
    A()
    {
        cout<<"A的構(gòu)造"<<endl;
    }
    virtual ~A()
    {
        cout<<"A的析構(gòu)"<<endl;
    }
    A(const A& other)
    {
        cout<<"A的拷貝構(gòu)造"<<endl;
    }
    virtual void show_info()
    {
        cout<<"我是父親"<<endl;
    }
};
class B:public A
{
public:
    B()
    {
        cout<<"B的構(gòu)造"<<endl;
    }
    ~B()
    {
        cout<<"B的析構(gòu)"<<endl;
    }
    void show_info()
    {
        cout<<"我是父親"<<endl;
    }
};
int main()
{
    A&& a=B();
    a.show_info();
//也可以使用,
    A&& a1=std::move(a);
    a.show_info();
    return 0;
}

結(jié)果圖:

用了右值引用我們就可以不用在加const了,也是我們工作開(kāi)發(fā)中常用的。

注意:我在這個(gè)代碼里面寫(xiě)了兩個(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)

#include <iostream>
using namespace std;
class A
{
    int *a;
public:
    A():a(new int[1024])
    {
        cout<<"A的構(gòu)造"<<endl;
    }
    A(const A& other)
    {
        a=new int[1024];
        memcpy(this->a,other.a,sizeof (int[1024]));
    }
    A(A&& other)
    {
        this->a=other.a;
        other.a=nullptr;
        cout<<"A的移動(dòng)構(gòu)造"<<endl;
    }
    ~A()
    {
        if(a!=nullptr){
            delete [] a;
            cout<<"A的析構(gòu)"<<endl;
        }
    }
};
int main()
{
    A a;
    A a1=std::move(a);
    return 0;
}

結(jié)果圖:

這樣就只析構(gòu)了一次就是正確的了。

到此這篇關(guān)于C++實(shí)例分析講解臨時(shí)對(duì)象與右值引用的用法的文章就介紹到這了,更多相關(guān)C++臨時(shí)對(duì)象與右值引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中priority_queue模擬實(shí)現(xiàn)的代碼示例

    C++中priority_queue模擬實(shí)現(xiàn)的代碼示例

    在c++語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)中的堆結(jié)構(gòu)可以通過(guò)STL庫(kù)中的priority_queue 優(yōu)先隊(duì)列來(lái)實(shí)現(xiàn),這樣做極大地簡(jiǎn)化了我們的工作量,這篇文章主要給大家介紹了關(guān)于C++中priority_queue模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解

    C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解

    這篇文章主要介紹了C語(yǔ)言 動(dòng)態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C/C++實(shí)現(xiàn)跨文件共享全局變量詳解

    C/C++實(shí)現(xiàn)跨文件共享全局變量詳解

    這篇文章主要為大家詳細(xì)介紹了C/C++如何實(shí)現(xiàn)跨文件共享全局變量,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì)

    C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)打地鼠游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 深入淺析C++中的#,##,和

    深入淺析C++中的#,##,和

    這篇文章主要介紹了C++中的#,##,和"的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • C++結(jié)構(gòu)體案例練習(xí)分享

    C++結(jié)構(gòu)體案例練習(xí)分享

    這篇文章主要和大家分享幾個(gè)C++?結(jié)構(gòu)體的案例練習(xí),幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下,希望能夠給你帶來(lái)幫助
    2022-04-04
  • C++實(shí)現(xiàn)轉(zhuǎn)置矩陣的循環(huán)

    C++實(shí)現(xiàn)轉(zhuǎn)置矩陣的循環(huán)

    大家好,本篇文章主要講的是C++實(shí)現(xiàn)轉(zhuǎn)置矩陣的循環(huán),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 淺談C++變量作用域

    淺談C++變量作用域

    這篇文章主要介紹了C++變量作用域的的相關(guān)資料,文中代碼非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • C語(yǔ)言鏈表完整操作演示

    C語(yǔ)言鏈表完整操作演示

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言鏈表的完整操作演示,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++ 實(shí)現(xiàn)對(duì)象池的具體方法

    C++ 實(shí)現(xiàn)對(duì)象池的具體方法

    本文主要介紹了C++ 實(shí)現(xiàn)對(duì)象池的具體方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

晴隆县| 穆棱市| 临颍县| 青阳县| 陇西县| 新乡市| 望都县| 瑞金市| 河北区| 定兴县| 昆山市| 寻乌县| 溧阳市| 通山县| 昌吉市| 冀州市| 鹤岗市| 南丰县| 永州市| 五莲县| 南乐县| 东明县| 河间市| 旺苍县| 五莲县| 玉龙| 雷山县| 马龙县| 县级市| 平武县| 林州市| 雷波县| 天长市| 疏勒县| 东明县| 绥德县| 高青县| 隆回县| 西藏| 南康市| 安康市|