C 建構函式

2021-07-03 03:37:30 字數 1442 閱讀 5859

1.什麼是拷貝建構函式:

ca(const ca& c)就是我們自定義的拷貝建構函式。可見,拷貝建構函式是一種特殊的建構函式,函式的名稱必須和類名稱一致,它的唯一的乙個引數是本型別的乙個引用變數,該引數是const型別,不可變的。例如:類x的拷貝建構函式的形式為x(x& x)。

當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

① 程式中需要新建立乙個物件,並用另乙個同類的物件對它初始化,如前面介紹的那樣。

② 當函式的引數為類的物件時。在呼叫函式時需要將實參物件完整地傳遞給形參,也就是需要建立乙個實參的拷貝,這就是按實參複製乙個形參,系統是通過呼叫複製建構函式來實現的,這樣能保證形參具有和實參完全相同的值。

③ 函式的返回值是類的物件。在函式呼叫完畢將返回值帶回函式呼叫處時。此時需要將函式中的物件複製乙個臨時物件並傳給該函式的呼叫處。

如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝,後面將進行說明。

自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。

淺拷貝和深拷貝

在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤。

深拷貝和淺拷貝可以簡單理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。

預設拷貝建構函式的行為如下:

預設的拷貝建構函式執行的順序與其他使用者定義的建構函式相同,執行先父類後子類的構造.

拷貝建構函式對類中每乙個資料成員執行成員拷貝(memberwise copy)的動作.

a)如果資料成員為某乙個類的例項,那麼呼叫此類的拷貝建構函式.

b)如果資料成員是乙個陣列,對陣列的每乙個執行按位拷貝. 

c)如果資料成員是乙個數量,如int,double,那麼呼叫系統內建的賦值運算子對其進行賦值.

3)拷貝建構函式不能由成員函式模版生成. 

原因很簡單

, 成員函式模版並不改變語言的規則

,而語言的規則說

,如果程式需要乙個拷貝建構函式而你沒有宣告它

,那麼編譯器會為你自動生成乙個

.所以成員函式模版並不會阻止編譯器生成拷貝建構函式

, 賦值運算子過載也遵循同樣的規則

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 構造器(建構函式)

定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...

C 建構函式

建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...