C 中類的建構函式與複製建構函式

2021-07-31 06:17:48 字數 2594 閱讀 1729

建構函式是類的特殊的成員函式,只要建立類型別的新物件,都要執行建構函式。建構函式的工作是保證每個物件的資料成員具有合適的初始值。建構函式的名字與類的名字相同,並且不能指定返回型別。像其他任何函式一樣,它們可以沒有形參,也可以定義多個形參。

複製建構函式是一種特殊建構函式,具有單個形參,該形參(常用const修飾)是對該類型別的引用。當定義乙個新物件並用乙個同型別的物件對它進行初始化時,將顯式使用複製建構函式。

c++支援兩種初始化方式:直接初始化和複製初始化。

複製初始化使用=符號,而直接初始化將初始化式放在圓括號中。

自定義乙個名為myclass的類。並且定義

myclass

類的預設建構函式、自定義建構函式和複製建構函式。

class myclass

myclass(const char* pc)

myclass(const classtest& ct)

};

接下來使用直接初始化和複製初始化定義myclass類的物件:

myclass mc1(「myclass」);

myclass mc2 = mc1;

執行後的效果如圖所示

從上圖可以看出,第1行**呼叫了

myclass

類的自定義建構函式,第

2行**呼叫了

myclass

類的複製建構函式。

對於myclass類物件的定義,還有一種方式,如下所示

myclass mc3 = 「myclass」;
這種定義方式是採用了哪種初始化呢?《c++ primer中文版第4版》

p407

頁提到,以上這種定義方式,「編譯器首先呼叫接受乙個

c風格字串形參的建構函式,建立乙個臨時物件,然後,編譯器使用複製建構函式將類的物件初始化為那個臨時物件的副本」。也就是說,以上**應該呼叫了

myclass

類的兩個建構函式,乙個是自定義的引數為

const char*

的建構函式,乙個是複製建構函式。然而,程式執行後的效果如圖所示

此時,只呼叫了myclass類的自定義函式,而沒有呼叫複製建構函式。產生這個現象的原因,在網路上有朋友提到「主要原因在於編譯器的優化,當複製建構函式是

public

時,編譯器就會根據這個特性來對**進行優化。當程式執行時,編譯器發現複製建構函式是

public

,則說明程式允許物件之間的複製,此時就會通過直接呼叫自定義建構函式來初始化物件,而不再呼叫複製建構函式,完成優化」。這位朋友還提到,如果將複製建構函式改為

private

,此時如下**

myclass mc3 = 「myclass」;
編譯時就會報錯。

但是,至少在vc++6.0及以上版本的編譯器中,並不是這樣的。在

vc++6.0/vs2005/vs2008/vs2010/vs2015

中進行測試,當將

myclass

類的複製建構函式改為

private

後,上述**編譯時並不報錯,而且都僅顯示「呼叫了自定義建構函式」。這就說明,至少在

vc++6.0/vs2005/vs2008/vs2010/vs2015

的編譯器當中,如下**

myclass mc3 = 「myclass」;
並沒有像《c++ primer中文版第

4版》中提到的那樣,呼叫了兩次建構函式,而是只呼叫了自定義的建構函式。可以說,在

vc++6.0/vs2005/vs2008/vs2010/vs2015中

myclass mc1(「myclass」);

myclass mc3 = 「myclass」;
是等價的。

在vc++6.0/vs2005/vs2008/vs2010/vs2015中進行測試時,確實發現了在「

2.2」中提到的編譯器優化問題。對於如下**

myclass mc4 = myclass();

在vc++6.0中進行測試時,執行結果顯示編譯器先呼叫

myclass

類預設建構函式,之後呼叫複製建構函式;而在

vs2005/vs2008/vs2010/vs2015

中則只顯示編譯器呼叫了預設建構函式。並且如果將複製建構函式設定為

private

,編譯器會報錯,如下所示:

error c2248: 「

classtest::classtest」:

無法訪問

private 成員(

在「classtest

」類中宣告)

這就說明,在vs2005/vs2008/vs2010/vs2015中,編譯器進行了優化,當發現複製建構函式是

public

時,直接呼叫預設建構函式。而當複製建構函式是

private

時,就會報錯。

c 類 建構函式 複製建構函式

複製建構函式是一種特殊的建構函式,它的作用是用乙個已經存在的物件去初始化另乙個物件。一般情況下不需要自行定義複製建構函式,系統預設提供乙個逐個複製成員值的複製建構函式。何時要使用呢?1.將新物件初始化為乙個同類物件 2.按值將物件傳遞給函式 3.函式按值返回物件 4.編譯器生成臨時物件 簡單的樣例如...

C 學習 建構函式與複製建構函式

在建構函式的函式頭初始化 includeusing namespace std class rectangle private const int length int width int main void 複製建構函式 預設複製建構函式的機制 includeusing namespace std...

c 類與物件(1) 構造,複製建構函式

當我們定義乙個基本型別變數時,方法如下 int p 定義乙個int型別變數 bool b 定義乙個bool型別變數 float c 定義乙個float型別變數 顯然定義變數p適用於儲存整數型別的,變數b是用於儲存布林型別的,變數c是用於儲存浮點數型別的。但是變數宣告的意義不只是這個,另乙個同樣重要的...