建構函式與析構函式

2021-06-25 19:19:48 字數 2728 閱讀 3435

概述:

乙個類有兩種特殊的成員函式:建構函式與析構函式。建構函式功能是在建立物件時,給資料成員賦初值,即物件的初始化。

析構函式的功能是釋放乙個物件,在物件刪除前,用它做一些記憶體釋放工作,與建構函式的功能相反。

建構函式:在物件建立時它會被自動執行,因此變數、物件的初始化**一般都放在建構函式中。

(1)物件的初始化過程

先看程式中變數、陣列、結構變數和物件的初始化過程。

在c++中,變數初始化有以下兩種等價形式:

int a(5);      //c++初始化形式

int b=8;      //c初始化形式

定義時初始化的目的是在編譯時為變數開闢記憶體空間的同時將初始值寫入記憶體空間。

陣列初始化:只有 」 = 「 這種形式。例如下列**

double c = ;

等價於下列賦值語句

c[[0]=1; c[1]=2; c[3]=3; c[4]=4;

結構變數初始化:

也使用 」 = 「這種形式,**如下:

struct  person

;person one=;

等價於下列賦值語句

strcpy(one.name, "dong");   one.height=170;  one.weight=130;

struct中各成員的預設訪問許可權是public,因此上述初始化操作是合法的。類的物件有所不同

類物件初始化:

class  cperson

cperson  one=;  //錯誤的賦值方式,

等價於賦值方式: strcpy(one.name, "dong");  one.height=170;  one.weight=130;

因為類中的資料成員預設都是private的,無法通過物件one來訪問私有資料成員。可以將class各成員訪問許可權             設定為public,這樣效果等同於struct,卻降低了類的封裝性。

類物件的資料成員初始化是通過類的成員函式來完成的

class  cperson

private:

char  name[20]; 

float  height;

float  weight;};

於是:cperson  one;     one.setvalue("dong", 170, 130);

// a: 呼叫成員函式設定初始值

a 語句通過呼叫成員函式來設定物件one的資料成員初始值,並非是物件的初始化格式。

乙個物件的初始化是指在定義的同時賦初值.

乙個類可以看成是乙個整體型別,類似於c++內建的基本型別int、char、float、double等。

物件初始化可以有:cperson  one( "dong", 170, 130);

物件初始化不一定要對所有的資料成員進行初始化,還可以有:

cperson  one("dong", 170, 130);

cperson  one(170, 130);

cperson  one;

為了實現以上形式的物件初始化操作,需要使用類的建構函式(constructor)。

(2)建構函式

c++規定,乙個類的建構函式必須與類同名,它可帶引數也可不帶引數,可以過載,也可以有預設的形參值。

上述物件初始化形式就是物件相應版本對建構函式的呼叫。例如:

one.cperson("dong", 170, 130);

one.cperson(170, 130);

one.cperson();

1、建構函式名必須與類名相同 2、定義的建構函式不能指定其返回值型別,也不能指定為void型別,建構函式主要是用於物件資料成員初始化,因而無須返回函式值,也就無須又返回型別。3、若要定義類物件,建構函式必須是公有型

成員函式,否則,類無法例項化。若類僅用於派生其他類,則建構函式可定義為保護型成員函式。

4、建構函式過載或設定建構函式預設形參值時,避免二義性。例如:

cperson(char *str, float h=170, float w=130) // a

cperson(char *str)   // b

當 cperson  other(" dong "); 時,即 other.cperson("dong");此時無法確認是哪個上述建構函式的呼叫。

預設建構函式:

cperson()

目的是使下列物件的定義形式合法:cperson  one;

若類中定義了指定的建構函式,則隱式的預設建構函式不再存在,對於 cperson  one 會報錯。

在類的設計中,無論宣告的類有幾個過載的建構函式,最好有乙個顯式定義的預設建構函式。這樣可以保證乙個         類總會有乙個預設的建構函式,或者是顯式的,或者是隱式的。

(3)析構函式

形如:~cperson()

1、每個類最多有乙個析構函式,且應為 public 型,否則類例項化後無法自動呼叫析構函式進行釋放。

2、不能被過載、沒有任何引數、沒有返回值、函式名前不能有任何關鍵字。例如void

3、析構函式也可以在類體外定義,但必須指明它所屬的類,在類體中還必須有析構函式的宣告。

4、如果類的宣告中沒有定義析構函式,編譯時會自動生成乙個隱式的不進行任何操作的預設析構函式。

在析構函式中,當要釋放的指標指向動態記憶體時,一定要先判斷指標的指向是否有效,且記憶體釋放後,一定要將指標置為0,null或null。這樣當析構函式多次呼叫時,由於有判斷語句,就不出現 」釋放未知記憶體的誤「發生。

建構函式與析構函式

建構函式 主要作用就是為物件初始化。有一點要說的是,在繼承體系彙總,如果在建構函式中,如果沒有指定基類的建構函式,那麼編譯器會在建構函式開頭加入,基類的預設建構函式,這樣就可以初始化基類物件部分 析構函式 對於析構函式,要說的多點,實際也不太複雜,就是加入了virtual 使其具有了多型性質 inc...

建構函式與析構函式

建構函式 先看看建構函式的呼叫順序規則,只要我們在平時程式設計的時候遵守這種約定,任何關於建構函式的呼叫問題都能解決 建構函式的呼叫順序總是如下 1.基類建構函式。如果有多個基類,則建構函式的呼叫順序是某類在類派生表中出現的順序,而不是它們在成員初始化表中的順序。2.成員類物件建構函式。如果有多個成...

建構函式與析構函式

建構函式 建構函式與類同名,沒有返回型別,可過載 需要注意的是,在初始化物件時,呼叫的是其建構函式或拷貝建構函式,而不會呼叫賦值函式,這是因為賦值運算子是在乙個現存的物件被賦予新的值的時候才被呼叫,而拷貝建構函式在呼叫期間,這個物件還處於未決狀態 建構函式不能是虛函式,若是給建構函式加上virtua...