C++ 關(guān)于拷貝控制和資源管理部分的筆記,并且介紹了部分C++ 智能指針的概念,然后實(shí)現(xiàn)了一個(gè)基于引用計(jì)數(shù)的智能指針。關(guān)于C++智能指針部分,后面會(huì)有專門的研究。

  • 通常,管理類外資源的類必須定義拷貝控制成員。為了定義這些成員,我們首先必須確定此對象的拷貝語義。一般來講,有兩種選擇:

    • 使類的行為看起來像一個(gè)值

      類的行為像一個(gè)值:意味著它有自己的狀態(tài)。當(dāng)我們拷貝一個(gè)像值的對象時(shí),副本和原對象是完全對立的。改變副本不會(huì)對對原對象有任何影響。反之亦然。
    • 使類的行為看起來像一個(gè)指針

      行為像指針的類則共享狀態(tài)。當(dāng)我們拷貝一個(gè)這種類的對象時(shí),副本和原對象使用相同的底層數(shù)據(jù)。改變副本也會(huì)改變原對象,反之亦然。
  • 行為像值的類

    • 通常組合了析構(gòu)函數(shù)和構(gòu)造函數(shù)的操作。類似析構(gòu)函數(shù),賦值操作會(huì)銷毀左側(cè)運(yùn)算對象的資源。類似構(gòu)造函數(shù),賦值操作會(huì)從右側(cè)運(yùn)算對象拷貝數(shù)據(jù)。

    • 編寫賦值運(yùn)算符時(shí),有兩點(diǎn)需要注意:

      1. 如果將一個(gè)對象賦予它自身,賦值運(yùn)算符必須能正確工作2. 大多數(shù)賦值運(yùn)算符組合了析構(gòu)函數(shù)和拷貝構(gòu)造函數(shù)的工作
    • 當(dāng)編寫一個(gè)賦值運(yùn)算符時(shí),一個(gè)好的方法是先將右側(cè)運(yùn)算對象拷貝到一個(gè)局部臨時(shí)對象中,然后再銷毀左側(cè)運(yùn)算對象就是安全的了。

    • 為了提供類值的行為,對于類管理的資源,每個(gè)對象應(yīng)該都擁有一份自己的拷貝。

    • 類值拷貝賦值運(yùn)算符

  • 定義行為像指針的類

    • 引用計(jì)數(shù)

      引用計(jì)數(shù)的工作方式如下:1. 除了初始化對象之外,每個(gè)構(gòu)造函數(shù)(拷貝構(gòu)造函數(shù)除外)還要?jiǎng)?chuàng)建一個(gè)引用計(jì)數(shù),用來記錄有多少對象正在與創(chuàng)建的對象共享狀態(tài)。當(dāng)我們創(chuàng)建一個(gè)對象時(shí),只有一個(gè)對象共享狀態(tài),因此計(jì)數(shù)器初始化為1。2. 拷貝構(gòu)造函數(shù)不分配新的計(jì)數(shù)器,而是拷貝給定對象的數(shù)據(jù)成員,包括計(jì)數(shù)器??截悩?gòu)造函數(shù)遞增共享的計(jì)數(shù)器,指出給定對象的狀態(tài)又被一個(gè)新用戶共享。3. 析構(gòu)函數(shù)遞減計(jì)數(shù)器,指出共享狀態(tài)的用戶少了一個(gè)。如果計(jì)數(shù)器變?yōu)?,則析構(gòu)函數(shù)釋放狀態(tài)。4. 拷貝賦值運(yùn)算符遞增右側(cè)運(yùn)算對象的計(jì)數(shù)器,遞減左側(cè)運(yùn)算對象的計(jì)數(shù)器。如果左側(cè)運(yùn)算對象的計(jì)數(shù)器變?yōu)?,意味著它的共享狀態(tài)沒有用戶了,拷貝賦值運(yùn)算符就必須銷毀狀態(tài)。
    • 引用計(jì)數(shù)的存放位置:一種方法只保存在動(dòng)態(tài)內(nèi)存中。當(dāng)創(chuàng)建一個(gè)對象時(shí),我們也分配一個(gè)計(jì)數(shù)器。當(dāng)拷貝或賦值對象時(shí),我們拷貝指向計(jì)時(shí)器的指針。使用這種方法,副本和原對象都會(huì)指向相同的計(jì)數(shù)器。

  • 下面給出一個(gè)基于引用計(jì)數(shù)的共享智能指針的實(shí)現(xiàn)。

            		

    延伸閱讀

    學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式