欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實例分析講解臨時對象與右值引用的用法

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

1.什么是臨時變量

在棧上定義對象時,當只調用類中的構造函數(shù)時,編譯器將在棧上創(chuàng)建一個臨時對象,這個臨時對象沒有地址。所以他的生命周期非常短。短到下一行代碼就被直接析構了。

代碼驗證

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

結果圖:

如圖所示,現(xiàn)在我們來分析結果,首先這是一個拷貝構造,拷貝構造指的是用一個已經初始化的值,去初始化另一個沒有初始化的值,前兩行的構造都是臨時變量的構造,然后開始拷貝構造,拷貝構造完成之后,立馬對兩個臨時構造進行析構,這個就證明了當只調用類中的構造函數(shù)時,編譯器將在棧上創(chuàng)建一個臨時對象,最后一個析構是拷貝構造的析構。

像這種情況我們就無法使用這個臨時變量,我們可以通過const常引用的方式來解決,我們都知道,我們無法直接int &a=100,無法直接引用一個常量,這個時候我們可以const int &a=100;所以,我們用這個方法來實現(xiàn)一下,代碼如下:

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

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

結果圖:

雖然我們得到了這樣一個結果圖,但是這是不方便得,所以我們就引出來了右值引用。

注意:此時B()已經不是一個臨時變量了,他有了地址,所以,現(xiàn)在這個就相當于

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

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

2.右值引用

2.1概念

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

右值:沒有地址量就是右值。

右值引用的語法形式:

右值引用類型&& 引用變量 = 常量或臨時對象

2.2代碼實現(xiàn)

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

結果圖:

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

注意:我在這個代碼里面寫了兩個可以調用多態(tài)的方法,第二個方法,如果一個右值想引用一個左值時,必須使用std::mover函數(shù),此時如果不加A&&,相當于一個拷貝構造。

2.3C++11新特性之移動構造

2.3.1移動構造函數(shù)的介紹

1.首先我們討論一下移動構造函數(shù)的優(yōu)缺點,有了移動構造我們就不用再開辟新的空間,提高了效率,但是也有它的缺點,缺點就是這玩意不是很安全,我們可以在這個里面修改這個值,可能會導致一些問題。

2.就是我們可能會想為什么我們不能把這個移動構造的邏輯直接,加入到拷貝構造中呢,只需要把const直接去掉不就一樣的了麻,但是如果我們把const去掉之后,我們other就不能是個常數(shù)了,這樣就導致了缺點,所以,移動構造函數(shù)是拷貝函數(shù)的一個優(yōu)化補充。

2.3.2代碼實現(xiàn)

#include <iostream>
using namespace std;
class A
{
    int *a;
public:
    A():a(new int[1024])
    {
        cout<<"A的構造"<<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的移動構造"<<endl;
    }
    ~A()
    {
        if(a!=nullptr){
            delete [] a;
            cout<<"A的析構"<<endl;
        }
    }
};
int main()
{
    A a;
    A a1=std::move(a);
    return 0;
}

結果圖:

這樣就只析構了一次就是正確的了。

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

相關文章

  • C++數(shù)位DP復雜度統(tǒng)計數(shù)字問題示例詳解

    C++數(shù)位DP復雜度統(tǒng)計數(shù)字問題示例詳解

    這篇文章主要為大家介紹了利用C++數(shù)位DP的復雜度來統(tǒng)計數(shù)字問題的示例實現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升值加薪
    2021-11-11
  • c/c++靜態(tài)庫之間相互調用的實戰(zhàn)案例

    c/c++靜態(tài)庫之間相互調用的實戰(zhàn)案例

    C++調用C的函數(shù)比較簡單,直接使用extern "C" {}告訴編譯器用C的規(guī)則去編譯C代碼就可以了,下面這篇文章主要給大家介紹了關于c/c++靜態(tài)庫之間相互調用的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例

    Sublime Text 3 實現(xiàn)C++代碼的編譯和運行示例

    下面小編就為大家?guī)硪黄猄ublime Text 3 實現(xiàn)C++代碼的編譯和運行示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • C語言版掃雷小游戲

    C語言版掃雷小游戲

    這篇文章主要為大家詳細介紹了C語言版的掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C/C++判斷素數(shù)的三種方法

    C/C++判斷素數(shù)的三種方法

    這篇文章主要給大家介紹了C/C++判斷素數(shù)的三種方法,常規(guī)的函數(shù)判斷法,埃氏篩法和歐拉篩法這三種方法,并通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • C語言中打印特殊圖案的實現(xiàn)代碼

    C語言中打印特殊圖案的實現(xiàn)代碼

    以下代碼實現(xiàn)了在C語言中打印特殊圖案的解決方法。需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)打印兩個有序鏈表公共部分的方法

    C++實現(xiàn)打印兩個有序鏈表公共部分的方法

    這篇文章主要介紹了C++實現(xiàn)打印兩個有序鏈表公共部分的方法,涉及C++針對有序鏈表的簡單遍歷、比較相關操作技巧,需要的朋友可以參考下
    2017-05-05
  • c語言獲取文件大小的示例

    c語言獲取文件大小的示例

    在C語言中測試文件的大小,主要使用二個標準函數(shù),下面是使用示例,需要的朋友可以參考下
    2014-02-02
  • C++類與對象的重點知識點詳細分析

    C++類與對象的重點知識點詳細分析

    類和對象是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據類型;變量就是可以變化的量,存儲在內存中—個可以擁有在某個范圍內的可變存儲區(qū)域
    2023-02-02
  • c++的glog與spdlog的性能對比測試分析

    c++的glog與spdlog的性能對比測試分析

    這篇文章主要為大家介紹了c++的glog與spdlog的性能對比測試分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05

最新評論