c 程式設計師定義的複製建構函式

2022-09-06 08:51:06 字數 1634 閱讀 1501

需要動態分配記憶體的建構函式,都需要程式設計師自己編寫複製建構函式,如果使用預設建構函式將會出現問題。

程式設計師可以定義乙個類的複製建構函式。程式設計師定義的複製建構函式必須有乙個形參,它是對同乙個類的引用。示例原型:

numberarray :: numberarray(numberarray &obj)

arraysize = obj.arraysize;

aptr = new double[arraysize];

for(int index = 0; index < arraysize; index++)

aptr[index] = obj.aptr[index];

注意:複製建構函式必須有乙個形參,該形參是對同乙個類的引用。如果忘記&識別符號引用形參將導致編譯器錯誤。此外,形參應該是乙個const引用,因為複製建構函式不應該修改被複製的物件。

無論何時,只要在函式呼叫中按值傳遞物件,那麼編譯器就會自動呼叫複製建構函式,以建立物件的副本。正是出於這個原因,複製建構函式的形參必須按引用傳遞;因為,如果在建構函式被呼叫時按值傳遞,那麼建構函式將立即被再次呼叫以建立按值傳遞的副本,從而導致對構造函式呼叫的無休止鏈條。

1. 複製建構函式的呼叫

每當建立乙個物件,並使用同乙個類的另乙個物件來初始化它時,系統將自動呼叫複製建構函式,示例:

rectangle box(5, 10);

rectangle b = box;  //初始化語句

rectangle b1(box);   //初始化語句

當函式呼叫接收到某個類型別的形參時,複製建構函式也會自動呼叫。例如:

void fun(rectangle rect)

假設使用以下語句來呼叫它: fun(fox);

這將導致rectangle複製建構函式被呼叫。最後,只要函式通過值返回類的物件,就會自動呼叫複製建構函式。因此,在以下函式中,當return語句被執行時將呼叫複製建構函式:

rectangle makerectangle()

rectangle rect(12,3);

return rect;

這是因為return 語句必須為該物件建立乙個臨時的非區域性副本,以便在函式返回之後,呼叫者可以使用該副本。總而言之,乙個類的複製建構函式將在以下下情況下被呼叫:

1)變數被使用同乙個類的物件初始化。

2)函式被使用類的形參值呼叫。

3)函式返回的值是乙個類的物件。

注意:當按引用或指標傳遞類的形參時,複製建構函式不會被呼叫。而且,當函式返回物件的引用或指標時,也不會呼叫複製建構函式。

由於預設的物件賦值遇到了與預設的複製建構函式相同的問題,所有人可能會認為,程式設計師定義的複製建構函式也可以用來解決賦值所導致的問題,但是事實並非如此。複製建構函式僅在建立物件並初始化物件時候才起作用。特別是,複製建構函式不能在賦值中呼叫。要理解初始化和賦值之間的區別,可以假設已經建立了first物件,然後來看以下語句:

numberarray second = first;   //複製建構函式被呼叫

該語句建立second物件,並使用first的值初始化它,這是乙個初始化語句,她導致建立建構函式被呼叫來執行初始化,但是,以下語句不一樣:

second = first;   //複製建構函式未被呼叫

該語句假定兩個物件都是以前建立的,它僅僅是乙個賦值語句,因此不會呼叫建構函式。

黑馬程式設計師 C 建構函式小結

asp.net android ios開發 net培訓 期待與您交流!建構函式是用來建立物件,並且可以在建構函式中為物件初始化。class a 這時在main函式中建立時即new a 時系統會建立乙個a類的物件並會將a的兩個成員變數初始化為name hhq age 21 建構函式沒有返回值且建構函式...

27 c c 程式設計師面試寶典 複製建構函式

27.c c 程式設計師面試寶典 複製建構函式 c 中物件的複製就如同 轉殖 使用乙個已有的物件快速地複製出多個完全相同的物件。在c 中,類除了提供預設建構函式和析構函式外,編譯器還提供乙個預設複製建構函式,每當建立物件的複製時,都將呼叫複製建構函式。面試題112 什麼是深複製與淺複製 分析 淺複製...

C 複製建構函式

c 複製建構函式,一般在一下幾種情況中出現 1 物件以值傳遞的方式傳入函式時 2 物件以值傳遞的的方式從函式返回 3 乙個物件通過另乙個物件初始化 4 陣列 根據陣列中的初始化列表初始化陣列的時候。5 容器 初始化順序容器中的元素 有3種情況必須使用複製建構函式 a 如果有資料成員是指標 b 要在建...