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

c++之移動(dòng)構(gòu)造函數(shù)或者移動(dòng)賦值運(yùn)算符的作用詳解

 更新時(shí)間:2025年03月04日 09:47:09   作者:_DCG_  
文章介紹了移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符的核心作用,它們通過資源管理權(quán)轉(zhuǎn)移的方式實(shí)現(xiàn)對(duì)象的構(gòu)造,減少內(nèi)存拷貝的開銷,移動(dòng)構(gòu)造函數(shù)的參數(shù)一定是一個(gè)右值引用

原理介紹

前面的文章中有的涉及到了移動(dòng)構(gòu)造函數(shù)或者移動(dòng)賦值運(yùn)算符,對(duì)于它們的形式有了一定的了解,但是對(duì)他們的核心作用以及為什么要引入這兩個(gè)東東,很多朋友還是一知半解。本文就是來解決這個(gè)問題的。

要理解這個(gè)問題繞不開右值引用,c++11之前的 版本中只有拷貝構(gòu)造函數(shù),而拷貝構(gòu)造函數(shù)是一般會(huì)深拷貝,即會(huì)創(chuàng)建兩個(gè)完全一樣的對(duì)象,包括指針指向的區(qū)域都會(huì)進(jìn)行重新申請(qǐng)內(nèi)存和拷貝。這種情況下如果對(duì)象是一個(gè)大數(shù)組或占用資源多的對(duì)象,就會(huì)產(chǎn)生很大的內(nèi)存拷貝開銷。那么如何解決這個(gè)問題呢?

c+11版本引入了右值引用、移動(dòng)語義來解決這個(gè)問題。這里先說結(jié)論:通過移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符產(chǎn)生的對(duì)象與元對(duì)象會(huì)產(chǎn)生一個(gè)資源的轉(zhuǎn)移。舉個(gè)形象的例子:小明手里有個(gè)籃球,小王手里沒有籃球,以前的拷貝構(gòu)造函數(shù)或者拷貝賦值運(yùn)算符重載的結(jié)果是小王會(huì)按照小明手里的籃球重新買一個(gè);而移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符重載實(shí)現(xiàn)則更像是小王把小明手里的籃球放到自己手里,而小明手里沒有了籃球。

從上面的例子可以看出移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符的作用就是通過資源管理權(quán)轉(zhuǎn)移的方式實(shí)現(xiàn)對(duì)象的構(gòu)造,使得可以減少內(nèi)存拷貝的開銷。

移動(dòng)構(gòu)造函數(shù)的的參數(shù)一定是一個(gè)右值引用。

下面是一個(gè)給出一個(gè)移動(dòng)構(gòu)造函數(shù)的典型的例子:

class MyClass
{
    std::string str;  //一個(gè)類成員
    int* ptr;  //一個(gè)指針成員

    public: 
        A(){}
        A(MyClass && a)::str(std::move(a.str))
        {
            
        }

        A operator=(MyClass&& a)  //移動(dòng)賦值運(yùn)算符重載
        {
            if(this != &a)
            {
                str = std:move(a.str); //這里因?yàn)閟tr::string類已經(jīng)實(shí)現(xiàn)了移動(dòng)構(gòu)造賦值運(yùn)算符,std::string作為一個(gè)類已經(jīng)支持了這個(gè),所以可以這樣做,如果是
                ptr = a.ptr;  //需要自己去切換指針?biāo)赶虻膮^(qū)域
                a.ptr = nullptr;  
            }
        }

}

注意事項(xiàng)

  1. 一個(gè)類的移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符的實(shí)現(xiàn)是由類自己實(shí)現(xiàn)的
  2. 如果要使用移動(dòng)構(gòu)造函數(shù)或者移動(dòng)賦值運(yùn)算符,那么用戶必須顯式的定義移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符的重載
  3. 一些c++標(biāo)準(zhǔn)庫中提供的類很多都已經(jīng)實(shí)現(xiàn)了移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符的重載,例如std::string、stl容器類、智能指針(std::shared_ptr<T>、std::unique_ptr<T>)等
  4. 用戶自己定義類在有需要的情況下需要在自定義的類中實(shí)現(xiàn)移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符重載。
  5. 移動(dòng)構(gòu)造函數(shù)或移動(dòng)賦值運(yùn)算符重載實(shí)現(xiàn)基于右值引用,一定是以右值引用作為參數(shù)的

思考

移動(dòng)構(gòu)造函數(shù)本質(zhì)是資源管理權(quán)的轉(zhuǎn)移,那如果跟std::shared_ptr<T>會(huì)發(fā)生什么?

  • 請(qǐng)看下面的代碼:
class MyClass
{
    public:
        A(){
            std::cout<<"A的構(gòu)造函數(shù)"<<std::endl;
        }
        ~A(){
            std::cout<<"A的析構(gòu)函數(shù)"<<std::endl;
        }   
}

class Container
{
    private:
        std::shared_ptr<MyClass> ptr;
    public:
        Container(Container&& container):ptr(std::move(container.ptr))
        {
            std::cout<<"移動(dòng)構(gòu)造函數(shù)"<<std::endl;
        }
        Container operator=(Container&& container)
        {
            if(this != &container)  //這里不能少
            {        
                ptr = std::move(container.ptr); //這里也可以,因?yàn)閟td::shared_ptr內(nèi)部實(shí)習(xí)拿了移動(dòng)賦值運(yùn)算符
            }    
        }
}

shared_ptr 的移動(dòng)操作:

  • 轉(zhuǎn)移資源所有權(quán)
  • 源指針置空
  • 保持引用計(jì)數(shù)不變
  • 是線程安全和異常安全的

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C語言實(shí)現(xiàn)掃雷小游戲

    基于C語言實(shí)現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了基于C語言實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C語言中數(shù)組常用的一些排序算法小結(jié)

    C語言中數(shù)組常用的一些排序算法小結(jié)

    數(shù)組的排序方法有很多,效率也各不相同,下面這篇文章主要給大家介紹了關(guān)于C語言中數(shù)組常用的一些排序算法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • C語言編程C++動(dòng)態(tài)內(nèi)存分配示例講解

    C語言編程C++動(dòng)態(tài)內(nèi)存分配示例講解

    這篇文章主要介紹了C語言編程C++動(dòng)態(tài)內(nèi)存分配示例講解,為什么存在動(dòng)態(tài)內(nèi)存分配?本文通過動(dòng)態(tài)內(nèi)存介紹及常見內(nèi)存錯(cuò)誤等示例來為大家講解
    2021-09-09
  • C++語言中std::array的用法小結(jié)(神器用法)

    C++語言中std::array的用法小結(jié)(神器用法)

    這篇文章主要介紹了C++語言中std::array的用法小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • C++中Stack(棧)的使用方法與基本操作詳解

    C++中Stack(棧)的使用方法與基本操作詳解

    Stack是一種常見的數(shù)據(jù)結(jié)構(gòu),常常被用來解決遞歸問題、括號(hào)匹配問題、函數(shù)調(diào)用棧等等。本文將介紹C++中stack的使用方法及基本操作,需要的可以參考一下
    2023-05-05
  • C++的拷貝構(gòu)造函數(shù)你了解嗎

    C++的拷貝構(gòu)造函數(shù)你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的拷貝構(gòu)造函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++中求余運(yùn)算符(%)示例詳解

    C++中求余運(yùn)算符(%)示例詳解

    求余運(yùn)算符“%”,二元運(yùn)算符,具有左結(jié)合性。參與運(yùn)算的量均為整型。求余運(yùn)算的結(jié)果等于兩個(gè)數(shù)相除后的余數(shù)??此坪芎?jiǎn)單的運(yùn)算符,卻也真要掌握用好它也不容易,這篇文章主要介紹了C++中求余運(yùn)算符(%)的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C++中const用于函數(shù)重載的示例代碼

    C++中const用于函數(shù)重載的示例代碼

    這篇文章主要介紹了C++中const用于函數(shù)重載的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • C語言實(shí)現(xiàn)雙人貪吃蛇游戲?qū)嵗a

    C語言實(shí)現(xiàn)雙人貪吃蛇游戲?qū)嵗a

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)雙人貪吃蛇游戲?qū)嵗a,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 深入理解C語言的new[]和delete[]

    深入理解C語言的new[]和delete[]

    new和delete既是C++中的關(guān)鍵字也是一種特殊的運(yùn)算符。這篇文章主要介紹了C++的new和delete詳解,需要的朋友可以參考下
    2021-09-09

最新評(píng)論

松潘县| 江川县| 天镇县| 闽侯县| 建始县| 和林格尔县| 怀宁县| 和田县| 绥化市| 黔西| 郓城县| 浦东新区| 象山县| 西宁市| 卢湾区| 凌源市| 宜丰县| 马公市| 新密市| 偃师市| 平邑县| 邻水| 娄烦县| 苗栗市| 滨海县| 奉节县| 庄河市| 阿克陶县| 阜平县| 宜黄县| 侯马市| 鄂托克前旗| 嘉义县| 定日县| 阿合奇县| 庄浪县| 吕梁市| 桃园市| 达尔| 凤庆县| 胶州市|