c 複製控制和智慧型指標實現

2021-07-13 02:29:37 字數 2302 閱讀 1748

c++複製控制提供物件複製時的行為自定義,主要分如下三種

a).複製建構函式

複製建構函式,顧名思義就是在複製物件時會呼叫的建構函式,很多時候隱式呼叫的,包含如下:

[1].宣告類物件時同時給乙個初始化值,此時叫複製初始化

如 class a; 

class b=a;

[2].函式形參為傳值,返回值為傳值時

如 void func(class a); 

class func();

[3].容器初始化時,指明容器個數時,此時會先生成乙個臨時物件,然後將此物件複製給其他的物件

如vectora(5);

[4].陣列形式初始化時,會一一複製對應物件

如class a = ;

b).賦值過載函式

賦值時,對於一般的都是直接使用合成賦值函式。但是對於成員變數為指標、物件或複製時希望完成其他附加操作的均需自己來處理賦值行為。

c).析構函式

最簡單的就是自動釋放成員指標指向的記憶體了。

如下為複製控制的實現

class ccopycontrol

;//預設建構函式

ccopycontrol::ccopycontrol( int ndata/*=0*/ )

//複製建構函式

ccopycontrol::ccopycontrol( const ccopycontrol& c )

//賦值過載函式

ccopycontrol& ccopycontrol::operator=( const ccopycontrol& c )

return *this;

}//析構函式

ccopycontrol::~ccopycontrol()

//複製資料

void ccopycontrol::copydata( const ccopycontrol& c )

//刪除資料

void ccopycontrol::deletedata()

}

需要注意點如下:

1.常見三種複製是一起出現的,即需要自定義一種複製行為時,往往另外兩種也需要自定義

2.需要禁止複製時,必須顯式地宣告其複製建構函式為private(其友元和成員依然可以複製)

3.如果要連友元和成員的複製也禁止,就可以宣告乙個private的複製建構函式但不對它進行定義。(如果複製類物件會提示編譯錯誤,如果成員和友元嘗試複製就會導致鏈結錯誤)

4.在實現時其實賦值過載函式是包含複製建構函式和析構函式功能的,此時可以將複製和析構功能單獨做到兩個私有函式中,如演示**中的copydata和deletedata

很自然想到,通過複製控制我們可以給指標包上一層殼,來管理指標對應記憶體的開闢和釋放,這就是所謂的「智慧型指標」。

可以看到前面演示時賦值過程指標為深拷貝,重新開闢了新的記憶體,複製的只是指標內容;但是為了實現智慧型指標,則必須共享指標,此時是淺拷貝,但是如果要實現自動釋放記憶體的功能,此時需要在物件析構函式時釋放記憶體,這樣就存在多次釋放的問題了,為此引入引用計數,只有引用計數為0時才真正釋放記憶體。

下面是我實現的乙個簡單的智慧型指標類

template class cmysmartptr

cmysmartptr()

/*複製控制*/

~cmysmartptr()

cmysmartptr(const cmysmartptr& p)

cmysmartptr& operator=(const cmysmartptr& p)

return *this;

} /*指標*和->解引用*/

t& operator*()

t* operator->()

private:

//裝飾類,為待管理的指標增加引用計數

class ccountt

~ccountt()

t* pt;

int ncount;

}; //統一共享的指標,依靠引用計數來釋放

private:

ccountt *pcountt;

void copydata(const cmysmartptr& p)

void deletedata() }

};

這裡注意如下幾點:

1.建立乙個私有類,專門用來包裝實際指標pt,為其提供引用計數

2.注意賦值時需要考慮注意自身對自身賦值的情況

3.這裡只是考慮了簡單的單執行緒,多執行緒可能還存在問題

C 智慧型指標實現

1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...

智慧型指標實現C

include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...

C 實現智慧型指標

c 11增加了智慧型指標 shared ptr unique ptr weak ptr 為了加深理解,自己實現智慧型指標 我們都知道shared ptr的核心思想通過引用計數來管理記憶體 先實現單個指標的自我管理,看下面 template class ref ref t p m ptr p ref ...