詳敘C 的建構函式,預設建構函式與析構函式

2021-07-26 23:58:18 字數 2527 閱讀 4931

//宣告乙個data類

class data

data(const data&d)//拷貝建構函式

data(const data&d) = delete;//阻止拷貝

/*data(int y=10, int m=10, int d=10);在宣告建構函式時指定預設引數值

建構函式中引數的值既可以通過實參傳遞,也可以指定為某些預設值,

如果使用者不指定實參值,編譯系統就使形參取預設值

注意:應在宣告函式時指定預設值,而不能只在定義建構函式時指定預設值*/

~data(){}//析構函式

private:

int year;

int month;

int day;

};/*

建構函式:

1.定義:是乙個特殊的成員函式,對物件進行初始化,建構函式名字必須與類名同名,無型別,無返回值,

不需要使用者呼叫,也不能被使用者呼叫,在建立物件時自動執行,在物件的生命週期內只呼叫一次

2.可以在宣告建構函式時指定預設引數

例如:data(int y=10, int m=10, int d=10);

//如果使用者不指定實參值,編譯系統就使形參取預設值

注意:應在宣告函式時指定預設值,而不能只在定義建構函式時指定預設值

3.初始化:

1)初始化列表用於初始化資料成員,並不指定這些資料成員的初始化順序,

資料在類中定義順序就是在引數列表中初始順序。

2)盡量避免使用成員初始化成員,成員的初始化順序最好和成員定義的順序保持一致

4.特性:

1)函式名與類名相同

2)沒有返回值

3)有初始化列表(可以不用)

4)新物件被建立,由編譯器自動呼叫,且在物件的生命週期內只呼叫一次。

5)建構函式可以過載,實參決定了呼叫哪乙個建構函式

6)無參的建構函式和帶有預設值(預設值不能隨便給,預設值的個數可以是任意的,

但是應從右向左給定)的建構函式都認為是預設建構函式,並且預設建構函式只能有乙個。

7)如果沒有顯示定義時,編譯器會提供乙個預設建構函式(不一定,看程式是否需要建構函式,

詳細解釋見上篇部落格「c++合成預設建構函式的真相」)。

5.作用:構建物件,初始化物件,型別轉換

拷貝建構函式:

1.定義:只有單個形參,而且該形參必須是本類物件的const引用(請思考為什麼?),它是特殊的建構函式

建立物件時使用已經存在的同類物件來進行初始化,由編譯器自動呼叫。

2.特徵:

1)它是建構函式的過載

2)如果沒有顯式定義,系統會自動合成乙個預設的拷貝建構函式,預設的建構函式

會將其引數的成員逐個拷貝到正在建立的物件中。

3)用途:

a.物件例項化物件

例如:data d1(2016,2,14);

data d2(d1);

b.將乙個物件作為實參傳遞非引用型別的形參

例如:void fun(const data d2){}

c.從乙個返回型別為非引用型別的函式返回乙個物件

data fun1()

解答:為什麼拷貝建構函式形參必須是本類物件的const引用?

若定義為:data(const data d)

因為引數的傳遞本身就是複製,而複製乙個臨時的data物件的時候要呼叫拷貝建構函式。

(也就是自己,呼叫自己的時候又是一次引數傳遞,所以又要呼叫一次自己(即:

調建構函式)),這樣會一直惡性迴圈下去,造成無休止遞迴呼叫。

4.阻止拷貝:

在新標準下,我們可以將拷貝建構函式和拷貝賦值運算子定義為刪除的函式

(delete)來阻止拷貝,雖然我們宣告了刪除的函式,但是不能以任何方式

使用它們,格式為:在引數列表後面加上「=delete」來指出我們希望將它定

義為刪除的。

例如:data(const data&d) = delete;//阻止拷貝

data &operator=(const data&)=delete//阻止賦值

注意:=delete必須出現在第一次宣告的地方,我們可以對任何函式指定=delete,

雖然刪除函式主要作用是禁止拷貝控制成員,但當我們希望引導函式匹配過程時,

刪除函式有時也是有用的。

析構函式:

1.定義:是類的乙個成員函式,與建構函式功能相反,

在物件被銷毀時,編譯器自動呼叫,釋放物件使用的資源(不是刪除物件),並銷

毀物件的非static資料成員(static區域性物件在函式呼叫結束時物件並不釋放,因此

也不用呼叫析構函式,只有在main函式結束或呼叫exit函式結束程式時候,才呼叫static

區域性物件的析構函式)。

2.先構造的後析構,後構造的先析構(他相當於乙個棧,先進後出)。

3.析構函式沒有返回值,沒有函式型別,也沒有函式引數。因此,它不能被過載,

乙個類可以有多個建構函式,但只有乙個析構函式。

*/

C 建構函式與預設建構函式

建構函式 c 用於構建類的新物件時需要呼叫的函式,該函式無返回型別!注意 是 無 不是空!void 預設建構函式 未提供顯式初始值時,用來穿件物件的建構函式。以上是二者的定義,但是單從定義很難對二者進行區別,下面依然看 1 class testclass 2 上面的注釋中已標出了預設建構函式和建構函...

C 的預設建構函式與建構函式

今天看書,忽然發現自己對預設建構函式 建構函式的理解很模糊,在實際專案中寫類時,這些細節問題並沒有涉及到。因此,就專門對著 c primer plus 將預設建構函式 構 造函式這一塊簡單總結一下。建構函式 c 用於構建類的新物件時需要呼叫的函式,該函式無返回型別!注意 是 無 不是空!void 預...

C 建構函式之預設建構函式

參考部落格 以下內容是在上述博主的部落格中提煉出來的 一 預設建構函式的含義是啥 主要就是 預設建構函式在呼叫的時候不需要顯示傳入實參的建構函式 二 預設的建構函式的分類 1 無參建構函式 就是沒有引數的建構函式 class sample 2 帶有形參,並且帶有預設值的建構函式 class samp...