C 中類的建構函式與析構函式(成員初始化列表)

2021-06-08 05:00:43 字數 1774 閱讀 3064

**

1.建構函式(constructor function):

用來實現自動初始化的特殊函式稱為建構函式,constructor是乙個物件建立時會自動執行的成員函式。

1) 建構函式的規定:

首先,它與所屬的類有著同樣的名稱

其次,建構函式沒有返回型別

建構函式的初始化列表的位置位於建構函式的宣告符和函式體之間,以乙個冒號(:)開始,資料成員後面跟著乙個括號,括號中為初始值,多個資料成員用逗號(,)分隔。

要弄清楚建構函式執行其實是分為兩個階段的:1)初始化階段;2)普通的計算階段階段。

初始化階段:初始化列表中顯示初始化的成員按照列表中圓括號內的值初始化,而對於初始化列表中沒有顯式列出的成員,若是類成員,則呼叫該型別的預設建構函式初始化,若是內建型別或者復合型別,則按照變數初始化的原則,在區域性作用域中的不做初始化,全域性作用於中的初始化為0。

普通的計算階段:一般是指在建構函式的函式體內對資料成員做賦值工作,千萬記住,在函式體內進行賦值操作之前,資料成員的初始化已經完成

。在日常使用中,建構函式初始化列表可以使用,也可以省略。但是有3中情況一定要用到建構函式初始化列表的:類中的資料成員含有  1)沒有預設建構函式的類型別成員 2)const資料成員  3)引用成員。

舉個例子:

#include using namespace std;

class constref

;constref::constref(int ii) //constructor function

//constref::constref(int ii):i(ii+1),c(ii+2),r(i) //正確的做法

{}void constref::show()

private:

int i;

int j;

};

?

編譯此程式會出錯,原因在於初始化列表初始化資料成員是按照定義的順序進行的,首先要初始化成員i,而成員i是用j來初始化的,此時j還沒有初始化,因此會出錯。

2) 建構函式的過載

直接通過例子來解釋:

#include using namespace std;

class distance

distance(int ft,float in):feet(ft),inches(in) //second constructor (twe args)

{}...

private:

int feet;

float inches;

};int main()

因為現在有兩個具有相同名稱(distance)的顯示的建構函式,所以我們說建構函式被過載了。在定義中所使用的引數數目決定了再物件被建立時將執行哪乙個建構函式。

我們可以看到:不帶引數的建構函式可以將資料成員初始化為常量;攜帶多個引數的建構函式可以根據引數傳遞的值將資料成員初始化。

3) 預設拷貝建構函式

功能:通過同一型別的其他物件初始化乙個物件。

像上衣個distance程式中:

distance dis1(11,6.25);

distance dis2(dis1);

distance dis3=dis1;

上述兩種格式都呼叫預設拷貝建構函式,並且可以互換。

2.析構函式:

除了名稱前面加乙個代字型大小以外,和建構函式相同。

和建構函式一樣,析構函式沒有返回值,也沒有引數。

析構程式最常用的功能是釋放建構函式分配給物件的記憶體。

類的建構函式 析構函式 成員函式與賦值函式

類的建構函式 1 預設的拷貝建構函式 和 預設的賦值函式 均採用 位拷貝 而非 值拷貝 的方式來實現,若類中含有指標變數,不能採用預設的方式。2 如果類存在繼承關係,派生類必須在其初始化表裡呼叫基類的建構函式。3 類的const 常量只能在初始化表裡被初始化,因為它不能在函式體內用賦值的方式來初始化...

建構函式 析構函式 成員函式(C 封裝例項)

希望暴露public 希望隱藏private 物件例項化有兩種方式,從棧例項化,從堆 new出來的 例項化。以誰做什麼作為核心。public 放前面,private放後面 屬性可以定義為private格式 唯讀屬性,只有get方法,沒有set方法。include include using name...

C 類的函式成員之建構函式

c 類的函式成員 共分為以下幾種 建構函式 析構函式 類的方法 類的靜態方法 屬性運算子 索引器 三 建構函式 建構函式是乙個類被例項化為物件時首先呼叫的乙個函式。它只被呼叫以此,且在類例項化的時候。所以通常類的建構函式用來進行初始化的一些工作。建構函式的結構如下 public class mycl...