C Primer第五版筆記 拷貝控制

2021-08-22 04:34:59 字數 1958 閱讀 8088

拷貝賦值函式

析構函式:

三/五法則:

default和阻止拷貝:

乙個類通過定義五種特殊的成員函式來控制其拷貝、賦值、移動以及銷毀操作:

拷貝建構函式、拷貝賦值運算子、移動建構函式、移動賦值運算子和析構函式。這些操作都是拷貝控制操作。

當實現自己的類的時候要想好在做這些操作時的規則,因為編譯器通常會自動生成預設的缺失函式,也許並不適用於自己的類。

拷貝建構函式的第乙個引數***必須是乙個引用型別***,雖然可以定義為非const型別,但此引數幾乎總是const型別的。

定義為引用的原因在於避免無限迴圈:

//假設類o已經有物件a,現在拷貝初始化物件b,如果引數不為引用的話,那麼

o b(a);

//因為形參是對物件的拷貝,所以需要先拷貝a,就相當於

o c(a);

o b(c);

//而此處對c也是同樣的處理就會無限拷貝下去了

拷貝初始化與直接初始化的不同在於:使用直接初始化時要求編譯器使用普通的函式匹配來選擇與我們提供的引數最匹配的建構函式,而拷貝初始化要求編譯器將右側運算物件拷貝到正在初始化的物件中,如果需要的化還需要進行型別轉換。

拷貝初始化會發生的情況:

1.使用=定義變數時;

2.將物件作為實參傳遞給乙個非引用型別的形參;

3.從乙個返回型別為非引用實參的函式返回物件;

4.用花括號列表初始化乙個陣列中的元素或者乙個聚合類中的成員。

被explicit修飾的建構函式不能進行隱式的型別轉換:

class a

private:

int i;

};class b

private:

int i;

};int main(void)

過載複製運算子必須定義為成員函式,其左側運算物件將繫結到this引數,其右側運算物件作為顯示引數傳遞,其引數與其所在類的型別相同:

class foo;
析構函式自身並不直接銷毀成員,成員是在析構函式體之後的析構階段中被銷毀的,在整個物件的銷毀過程中,析構函式體是作為成員銷毀步驟之外的另一部分而進行的。

由於拷貝控制操作是由三個特殊的成員函式來完成的,所以我們稱此為「c++三法則」。在較新的 c++11

標準中,為了支援移動語義,又增加了移動建構函式和移動賦值運算子,這樣共有五個特殊的成員函式,所以又稱為「c++五法則」。也就是說,「三法則」是針對較舊的

c++89 標準說的,「五法則」是針對較新的 c++11 標準說的。為了統一稱呼,後來人們幹把它叫做「c++ 三/五法則」。

c++語言並不要求定義所有的拷貝控制操作,但又一下原則需要注意:

1.需要析構函式的類也需要拷貝和賦值操作;

2.需要拷貝操作的類也需要賦值操作,反之亦然;

default可以顯示的讓編譯器呼叫合成的函式;

對於某些類來說,拷貝和賦值是沒有意義的,定義時需要採用某種機制阻止拷貝或賦值。

在新標準下,可以通過將拷貝建構函式和拷貝賦值運算子定義為刪除的函式來阻止拷貝,刪除函式是一種雖然被宣告,但是卻不能以任何方式使用的函式。在函式的引數列表後面加上=delete來指出我們希望將它定義為刪除的:

stuct a;
=delete與=default不同之處在於:

1.=delete必須出現在函式第一次宣告的時候,因為編譯器需要提前知道乙個函式時刪除的,已阻止對它的操作;

2.可以對任何函式使用=delete,但=default只能作用與編譯器可以合成的預設建構函式或拷貝控制成員。

因為析構函式被刪除,就無法銷毀此型別的物件了。

對於乙個刪除了析構函式的型別,編譯器將不允許定義該型別的變數或建立該型別的臨時物件。

如果乙個類的某個成員刪除了析構函式,也不能定義該類的變數或者臨時物件。

C Primer第五版筆記 關聯容器

一 型別 關聯容器支援高效的關鍵字查詢和訪問,標準庫中兩個主要的關聯容器是map和set。map中的元素是鍵值對關鍵字表示索引。set中每個元素只包含乙個關鍵字,set支援高效的關鍵字查詢。關聯容器根據三個特性可以分為8種 1 set還是map 2 關鍵字是否可以重複,允許重複的容器名字中都包含單詞...

C Primer第五版筆記 動態陣列

allocator類 為了讓new分配乙個物件陣列,需要在型別名後跟方括號,括號中是分配物件的數目,該數目必須是整型,但不必是常量 new t 分配的記憶體並不是得到乙個陣列,而是得到乙個陣列元素型別的指標,因此不能對動態陣列呼叫begin和end 與普通陣列不同的是,普通陣列不能定義長度為0的陣列...

C Primer第五版筆記 虛函式

當我們使用基類的引用或指標呼叫乙個虛成員函式時會發生動態繫結,知道執行時才會知道到底呼叫了哪個版本的虛函式,因此所有的虛函式都必須有定義。對虛函式的呼叫可能在執行時才被解析 物件導向程式設計的核心思想是多型性 polymorphism 多型性這個詞源於希臘語,其含義是 多種形態 引用或指標的靜態型別...