拷貝構造的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,成為拷貝建構函式。
拷貝建構函式通常不應該是explicit
,可以接受非const
引用。
合成拷貝建構函式class foo
;
編譯器會自動合成拷貝建構函式。一般情況中,合成的拷貝建構函式會將其引數的成員逐個拷貝到正在建立的物件中。編譯器從給定物件中依次將每個非 static 成員拷貝到正在建立的物件中。
成員的型別決定了拷貝的方式:
拷貝初始化
拷貝初始化是依靠拷貝建構函式或移動建構函式來完成的。
拷貝初始化發生情況:
拷貝初始化的限制
如果拷貝初始化需要通過explicit建構函式進行初始化,要顯式使用。
編譯器繞過拷貝建構函式
過載賦值運算子string null_book =
"1246543213615"
;//拷貝初始化
string null_book
("1246543213615");
// 編譯器略過拷貝建構函式
過載運算子的引數表示運算子的運算物件,如果是成員函式,左側運算物件就繫結到隱式的this引數。
析構函式釋放物件在生存期分配使用的資源,銷毀物件的非static資料成員。class foo
;
內建型別沒有析構函式。
隱式銷毀乙個內建指標型別的成員不會delete它所指向的物件。與普通指標不同,智慧型指標是類型別,具有析構函式。
調動析構函式情形:
當指向乙個物件的引用或指標離開作用域時,析構函式不會執行。
如果乙個類需要自定義析構函式,則它也需要自定義拷貝建構函式和拷貝賦值運算子。
如果乙個類需要拷貝建構函式,則它也需要乙個拷貝賦值運算子,反之亦然。
通過將拷貝控制成員函式/預設建構函式定義為=default顯式要求編譯器生成合成的版本。
例如,iostream 類阻止拷貝,避免多個物件寫入或讀取相同的io緩衝。class sales_data
;// 不是內聯函式
sales_data& sales_data:
:operator=
(const sales_data&)=
default
;
第13章 拷貝控制
拷貝建構函式class foo sales data sales data const sales data orig bookno orig.bookno units sold orig.units sold revenue orig.revenue 拷貝賦值運算子foo operator con...
13章,拷貝控制
ex1 1,拷貝建構函式的定義 乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值。2,出現場合 ex2 拷貝建構函式自己的引數必須是引用型別。因為如果不是的話,在呼叫拷貝建構函式時,將乙個物件作為實參傳遞給乙個非引用型別的形參時,會再次呼叫該拷貝建構函式陷入死迴圈。ex5haspt...
第13章 複製控制
複製建構函式 賦值操作符和析構函式總稱為複製控制 copy control 複製建構函式可用於 1 根據另乙個同型別的物件顯式或隱式初始化乙個物件 2 複製乙個物件,將它作為實參傳給乙個函式 3 從函式返回時複製乙個物件 4 初始化順序容器中的元素,如vectorsev 5 分別用了預設建構函式和複...