如果乙個建構函式第乙個引數是自身類型別的引用,且任何額外引數都有預設值,則為拷貝建構函式
拷貝初始化發生情況:
拷貝建構函式自己的引數必須是引用型別否則會遞迴死迴圈(
拷貝賦值運算子是乙個名為 operator= 的函式
建構函式初始化物件的非static
資料成員;析構函式釋放物件使用的資源,並銷毀物件的非static
資料成員
什麼時候呼叫析構函式需要析構函式的類也需要拷貝和賦值操作
考慮如下**:
class
hasptr
~hasptr()
private
: std::string *ps;
int i;
};
在上述類中,建構函式中分配的記憶體將在hasptr
物件銷毀時被釋放。不幸的是,上述類中使用了編譯器自動合成的拷貝建構函式和拷貝複製運算子。這些函式簡單拷貝指標成員,這意味著多個hasptr
物件可能指向相同的記憶體:
hasptr f (hasptr hp)
當上述函式f
返回時候,hp
和ret
都被銷毀,在兩個物件上都會呼叫hasptr的析建構函式,此析構函式會deleteret
和hp
中的指標成員。但這兩個物件包含相同的指標值,導致double free
;
需要拷貝操作的類也需要賦值操作,反之亦然我們可以通過拷貝控制成員定義為=default
來顯示地要求編譯器生成合成的版本
我們可以通過將拷貝建構函式和拷貝複製運算子定義為刪除的函式來組織拷貝。刪除的函式是這樣一種函式:我們雖然宣告了它們,但不能以任何方式使用它們。
析構函式不能是刪除的成員行為像值的類
行為像指標的類
第十三章 拷貝控制
在定義任何 c 類時,拷貝控制操作都是必要部分。如果我們不顯示定義這些操作,編譯器也會為我們定義,但編譯器定義的版本的行為可能並非我們所想。拷貝初始化不僅在我們用 定義變數時會發生,在下列情況下也會發生 將乙個物件作為實參傳遞給乙個非引用型別的形參 從乙個返回型別為非引用型別的函式返回乙個物件 用花...
第十三章 拷貝控制
拷貝控制操作 copy control 合成拷貝賦值運算子 合成析構函式 賦值運算子組合了析構函式和拷貝建構函式的工作,先在底層生成物件空間,刪除類內原有的記憶體空間,然後指向新分配的指標。hasptr operator const hasptr hp move函式 移動賦值運算子 合成的移動操作 ...
第十三章筆記 拷貝控制
乙個類通過定義五種特殊的成員函式來控制這些操作,包括 拷貝建構函式 copy construcor 拷貝賦值運算子 copy assignment operator 移動建構函式 move constructor 移動賦值運算子 move assignment operator 和析構函式 dest...