拷貝建構函式 筆記

2021-10-11 02:52:42 字數 1459 閱讀 2498

乙個建構函式的引數是自身類型別的引用,且任何額外引數都有預設值,則此建構函式是拷貝建構函式。

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 拷...