乙個建構函式的引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。
class
foo
如果我們沒有為類定義拷貝建構函式,編譯器會為我們定義乙個。與合成預設建構函式不同,即使我們定義了其他建構函式,編譯器也會為我們合成乙個拷貝建構函式。
合成的拷貝建構函式會將引數的成員逐個拷貝到正在建立的物件中。
編譯器從給定物件中依次將每個非static成員拷貝到正在建立的物件中。
每個成員的型別決定了它如何拷貝:對類型別成員,會使用其拷貝建構函式來拷貝。
內建型別的成員則直接拷貝。
合成拷貝建構函式會逐元素地拷貝乙個陣列型別成員。如果陣列元素是類型別,則使用元素的拷貝建構函式來進行拷貝。
calss sales_data
sales_data
::sales_data
(const sales_data &orig)
:bookname
(orig.bookname)
;//類成員,使用類的拷貝建構函式
m_a(orig.m_a)
;//拷貝orig.m_a
m_b(orig.m_b)
;//拷貝orig.m_b
//空函式體
現在我們可以完全理解初始化和拷貝初始化直之間的差異了
string book(10
,'.');
//直接初始化
string book2
(book)
;//直接初始化
string big_book = book;
//拷貝初始化
string null_book =
"99"
;//拷貝初始化
string read_book =
string(2
,'9');
//拷貝初始化
拷貝初始化通常使用拷貝建構函式完成。但是乙個類有乙個移動建構函式,則拷貝初始有時會使用移動建構函式,而非拷貝建構函式來完成。
拷貝建構函式不僅在我們用=定義變數時會發生,在下列清空也會發生
為什麼拷貝建構函式的引數一定要是引用型別
在函式呼叫的過程中,具有非引用型別的引數要進行拷貝初始化。類似的,當乙個函式具有非引用的返回型別時,返回值會被用來初始化呼叫結果。
拷貝建構函式被用來初始化非引用型別引數,這一特性解釋了為什麼拷貝建構函式的引數必須是引用型別。如果其引數不是引用型別,則呼叫永遠也不會成功------為了呼叫拷貝建構函式,我們必須拷貝它的實參,但為了拷貝實參,我們有需要呼叫拷貝建構函式,如此無限迴圈。
string book =
"99"
//拷貝初始化
string yellow_book
("199");
//編譯器略過了拷貝建構函式
拷貝建構函式筆記
格式 person const person p person視為乙個任意的類名 const 使p的成員值不能發生改變 1 括號法 person p1 person p2 10 有參建構函式 person p3 p2 呼叫拷貝建構函式 注意事項 呼叫預設建構函式時,不要加 解釋 加括號時,編譯器會認...
oc建構函式筆記
1,建構函式的作用 用來對alloc建立的物件 及用alloc來分配儲存空間,是一塊 地 進行初始化。如果初始化失敗,則返回nil。2,如果是無參建構函式,函式名必須是init。返回值必須是id,函式前面必須是 號,如 id init 系統會自帶乙個無參的建構函式,作用是將當前物件的所有成員的內容初...
呼叫建構函式筆記
include using namespace std class cpoint 帶乙個引數的可用於型別轉換的建構函式 explicit 加上 explicit 可防止 cpoint pt1 1 這種隱性轉換 cpoint int ix 帶引數的建構函式 cpoint int ix,int iy 拷...