C Primer筆記之複製控制

2022-02-04 02:15:11 字數 2595 閱讀 9644

複製控制這一節需要注意的地方不多,主要有以下幾點:

1、定義自己的複製建構函式

什麼時候需要定義自己的複製建構函式,而不用系統提供的,主要遵循以下的經驗說明:

某些類必須對複製物件時發生的事情加以控制,這樣的類(1)經常有乙個資料成員是指標,(2)有成員在建構函式中分配的其他資源;

而另一些類在建立物件時必須做一些特定的工作。

2、禁止複製

有些類是需要禁止複製的,如iostream類就不允許複製,但編譯器始終都會預設合成乙個,但還是有辦法的:

為了防止複製,類只要顯示宣告其複製建構函式為private就行了。

然而,這樣,類的友元和成員仍可以進行複製,如果想要連友元和成員中的複製也禁止,就可以宣告乙個private複製建構函式但不對其定義,這是合法的。

3、析構函式的異同

與複製建構函式或賦值操作符不同,編譯器總是會為我們合成乙個析構函式,合成析構函式按照物件建立時的逆序撤銷每個非static成員。

析構函式與複製建構函式或賦值操作符之間的乙個重要區別是:即使我們編寫了自己的析構函式,合成析構函式仍然會執行。合成析構函式。

4、智慧型指標

智慧型指標是由於在有指標成員的類中,指標所指向的物件是共享的,防止出現懸垂指標而提出的一種管理指標的辦法。

為了闡述智慧型指標,我們來看乙個例子:

1

class

hasptr //

p是指向int型陣列的指標

4 hasptr& operator = (const hasptr&rhs);

5int *getptr()

8int

getvalue()

1112

void setptr(int *p)

15void setvalue(int

i) 18

19int getptrvalue() const

22void setptrvalue(int

i) 25

26private:27

int *uptr;

28int

val;

29 };

int obj = 0;

hasptr ptr1(&obj, 42);

hasptr ptr2(ptr1);

ptr1和ptr2的值相同,改變任意乙個的值都可以改變其共享物件的值。

再看,可能出現懸垂指標的情況:

int *ip = new int(42);

hasptr ptr(ip, 10);

delete ip;

ptr.set_ptr_val(0); //disaster!!!

這裡ip和ptr中的指標指向了同一物件,刪除了該物件時,ptr中的指標不再指向有效物件,但是你又不知道該物件不在了,所以,這樣就出現了懸垂指標。

所以,定義智慧型指標能有效地解決這個問題,為了避免多個指標共享乙個物件時撤銷出現的懸垂指標問題,定義智慧型指標類的主要功能就是來保證在撤銷指向物件的最後乙個指標時才刪除該物件。

為了統計指向共享物件的指標的數量,引入使用計數,用其跟蹤該類有多少個物件共享同一指標,但使用計數為0時,刪除物件。在設計上,將使用計數設計成乙個單獨的類,用來封裝使用計數和相關指標。

如下:

1

//僅由hasptr使用的u_ptr類,用於封裝使用計數和相關指標

2class

u_ptr

7 ~u_ptr()

8 };

引用上面的那個類,不同的是,讓hasptr類儲存乙個指向u_ptr物件的指標,u_ptr物件再指向實際的int基礎物件。如下:

1

class

hasptr //

p是指向int型陣列的指標

4 hasptr(const hasptr&orig):uptr(orig.uptr),val(orig.val)

7 hasptr& operator = (const hasptr&rhs);

8 ~hasptr()

1213

int *getptr()

16int

getvalue()

1920

void setptr(int *p)

23void setvalue(int

i) 26

27int getptrvalue() const

30void setptrvalue(int

i) 33

34private:35

u_ptr *uptr;

36int

val;

37 };

其中,紅色部分是改動過的。賦值操作符像下面這樣:

1 hasptr& hasptr::operator =(const hasptr &rhs)

2

還有一種方法是定義值型別:

這種思路很簡單,就是給指標成員提供值語義,複製值型物件時,會得到乙個不同的新副本,對副本所做的改變不會反映在原有物件上。如下,可以對賦值操作符做點改變:

1 hasptr& hasptr::operator =(const hasptr &rhs)

2

C Primer筆記 13 複製控制

當定義乙個新型別的時候,需要顯式或隱式地指定複製 賦值和撤銷該型別的物件時會發生什麼 這就是通過定義特殊成員 複製建構函式 賦值操作符和析構函式來達到的。如果沒有顯式定義複製建構函式或賦值操作符,編譯器會為我們定義。複製建構函式 賦值操作符和析構函式總稱為複製控制 copy constrol 編譯器...

C Primer 學習筆記 複製控制

複製建構函式 賦值操作符和析構函式總稱為複製控制。一.複製建構函式 1.複製建構函式用途 只有單個形參,而且該形參是對本類型別物件的引用 通常是const修飾 的建構函式,稱為複製建構函式,它通常可用於 1.根據另乙個同型別的物件顯示或隱式初始化乙個物件.string str1 100000 str...

C Primer 複製控制

複製建構函式 當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式 a a a 當將該型別的物件傳遞給函式或從函式返回該型別的物件時,將隱式使用複製建構函式 顯式使用和隱式使用的區別?析構函式 當物件超出作用域或動態分配的物件被刪除時,將自動應用析構函式。複製建構函式,賦值操...