C 控制代碼類(智慧型指標)小結

2021-07-24 04:24:36 字數 2651 閱讀 4342

控制代碼類作用主要有兩個:

控制代碼類儲存和管理基類指標,指標既可以指向基類型別物件又可以指向派生型別物件。使用者通過控制代碼類訪問繼承層次的操作,使用者

可以獲得動態行為

,同時能夠確保自動正確的銷毀動態分配的物件,防止記憶體洩露。《c++ primer》15.7節中用購物籃的例子說明

了c++不能通過物件

支援多型,而必須

使用指標或引用。如果multiset儲存基類的物件:派生類物件只有基類部分儲存下來,而派生

類部分被切掉;如果儲存派生類的物件

,基類物件無法有

效轉換為派生類物件。

在effective c++類的實現中條款22說明了為了實現介面和實現的分離,將物件的實現隱藏在指標身後,這樣就能減少標頭檔案的編譯

依賴關係。實現技

共享同一指標。計數器變化的情

況:

一、指標型控制代碼

定義乙個控制代碼類,管理繼承層次中物件的指標,同時使用引用計數,自動釋放相關繼承類的物件。

//基類

class a

private:

... //類定義

};//派生類

class b : public a

private:

... //類定義

};//控制代碼類,管理物件指標和引用計數

class c

// 用繼承中的物件生成控制代碼類物件

c( const a &a ) : p( a.clone()), use( new int(1)) {}

//複製建構函式

c( const handle &h ) :

p(h.p), use(h.use) //計數加1

~c()

const a *operator->() const //返回物件指標

const a &operator*() const //返回物件

c &operator=( const c &); //賦值

private:

a *p; //物件指標

int *use; //引用計數

void decr_use()

}};

賦值操作

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

控制代碼類的使用

c h1(a); //用乙個基類物件生成乙個控制代碼類物件

c h2(h1); //用h1來初始化h2,它們物件指標指向同乙個物件 a,計數指標指向同乙個值。

b b;

c h3(b); //派生類物件生成乙個控制代碼類物件

multisetmc;

mc.insert(h1);

mc.insert(h2);

mc.insert(h3); //所有物件都能被完整儲存

//注意:插入關聯容器需要物件有比較函式

二、泛型控制代碼類

由於(一)中控制代碼類包含指向繼承層次中某型別物件指標和計數式的複製控制,因此可以定義乙個控制代碼類模版,管理指標和進行使

用計數。

template class handle 

// 複製建構函式

handle( const handle& h ): ptr(h.ptr), use(h.use)

//過載操作符 * 和 -> ,const 和 非const版本

t& operator*();

t* operator->();

const t& operator*() const;

const t* operator->() const;

// 過載操作符 =

handle& operator=( const handle& );

~handle()

private:

t* ptr; // 物件指標

int *use; // 引用計數

void rem_ref()}};

基類a、派生類b和模版類中的其它函式的定義與(一)中,不再重複。

泛型控制代碼類使用

class c

// 複製建構函式

c( const a &a ) : h(a.clone()) {}

//過載操作符 * 和 ->

const a &operator*() const

const a *operator->() const

private:

handleh; // 使用控制代碼類

};

由於這個版本的類c沒有指標成員,所以不需要複製控制成員,管理使用計數和相關物件的工

作在 handle 內部

完成。

可以將使用模版控制代碼類定義的類c與原來的類c進行對比:兩個類介面沒有改變,因此類c的使用與上面相同。

C 中的控制代碼類(智慧型指標)

最近工作中用到了控制代碼類,特意了解了一下,後來發現所謂的控制代碼其實和智慧型指標就是一回事。為了能夠更好的理解控制代碼類,建議大家先了解c 中類 類的繼承 多型等概念,不然很容易懵。控制代碼 handler 之所以翻譯成柄,就是用乙個類來撬動很多類。類似於從一大堆數中,只要拿著乙個數 基類 後面跟...

智慧型指標小結

智慧型指標的存在是為了巧妙的解決程式設計過程中資源洩露的問題,利用了棧的特性,出棧之後物件會自動析構的特點來對資源進行有效的釋放。主要存在的有兩大類智慧型指標,帶引用計數的智慧型指標和不帶引用技術的智慧型指標 不帶引用的智慧型指標 auto ptr scoped ptr unique ptr 以及帶...

C 智慧型指標用法小結

智慧型指標的出現,讓很多記憶體洩漏的隱患降低了不少,但是本人真的非常非常不推薦大面積鋪開使用智慧型指標這個東西,這個東西一是效能不如老老實實new delete,而且一旦沒用用好,反而適得其反。但是畢竟智慧型指標也是很多人在用,作為複習進行一下小結。已經完全可以淘汰的auto ptr就不說了,沒人會...