c++拷貝控制
當定義一個類時,我們顯式地或隱式地指定在此類型的對象拷貝、移動、賦值和銷毀時做什麽。一個類通過定義五種特殊的成員函數來控制這些操作。包括:拷貝構造函數、拷貝賦值運算符、移動構造函數、移動賦值運算符和析構函數。拷貝和移動構造函數定義了當用同類型的另一個對象初始化本對象時做什麽。拷貝和移動賦值運算符定義了將一個對象賦予同類型的另一個對象時做什麽。析構函數定義了當此類型對象銷毀時做什麽。我們稱這些操作為拷貝控制操作。
在定義任何C++類時,拷貝控制操作都是必要部分。對初學C++的程序員來說,必須定義對象拷貝、移動、賦值或銷毀時做什麽,這常常令他們感到困惑。這種困擾很復雜,如果我們不顯式的定義這些操作,編譯器也會為我們定義,但編譯器定義的版本的行為可能並非我們所想。
拷貝、賦值與銷毀
拷貝構造函數、拷貝賦值運算符和析構函數
拷貝控制和資源管理
確定類型對象的拷貝語義。定義拷貝操作使類的行為看起來像一個值或者像一個指針。
交換操作
除了定義拷貝控制成員,管理資源的類通常還定義一個名為swap的函數。對於那些與重排元素順序的算法一起使用的類,定義swap是非常重要的。如果一個類定義了自己的swap,那麽算法將使用類自定義版本。否則,算法將使用標準庫定義的swap。為了交換2個對象我們需要進行一次拷貝和兩次賦值。
動態內存管理類
某些類需要在運行時分配可變大小的內存空間。這種類通常可以使用標準庫容器來保存他們的數據。某些類需要自己進行內存分配。這些類一般來說必須定義自己的拷貝控制成員來管理所分配的內存。
對象移動
新標準的一個最主要的特性是可以移動而非拷貝對象的能力。某些情況下,對象拷貝後就立即被銷毀了,這時,移動而非拷貝對象會大幅度提升性能。
c++拷貝控制