C 之建構函式和析構函式

2021-08-25 22:27:05 字數 1912 閱讀 1949

我們已經知道了物件就是類的例項,二者的關係就相當於資料型別與它的變數的關係。每個物件區別於其他物件的地方就是依靠它的自身屬性,即資料成員的值。c++中,物件在定義的時候進行的資料成員的設定,稱為物件的初始化。同樣,在特定物件使用結束時,還要對資料成員進行一些清理工作。c++中對類的初始化和清理的工作,分別由兩個特殊的成員函式完成,它們就是建構函式和析構函式。

建構函式的作用就是在物件建立時,利用特定的值構造物件,將物件初始化為乙個特定的狀態,使此物件具有區別於彼物件的特徵。

建構函式的函式名與類名相同,而且它沒有返回值,不能有任何返回型別,也不能使用void,建構函式通常被定義為公有函式。但是,這個建構函式只能呼叫一次。

可以定義建構函式使cdate類的物件在生成時就獲得乙個預設的日期值,類cdate的定義修改如下:

class cdate

建構函式的實現過程

cdate::cdate()

cdate::cdate(int y,int m,int d)

在類的定義中增加了建構函式cdate(),並定義了過載的建構函式。作為類的成員函式,建構函式可以使用所有的資料成員,建構函式可以帶有參數列,也可以不帶,但是絕對沒有返回值,因為它是乙個物件的初始化,沒必要使用返回值。

建立物件時建構函式是被自動呼叫的,至於呼叫哪個建構函式,依據匹配情況自動選擇。在建立乙個物件時,可以使用帶引數的建構函式將物件進行初始化,則物件的定義形式為

void main()

上例中,建立物件時date1時,呼叫建構函式cdate(); 而建立date2時,呼叫建構函式cdate(int,int ,int)

在建立物件時呼叫了無引數的建構函式cdate(),此時不要再物件名後加圓括號。以下定義乙個物件是錯誤的:

cdate date1();

這樣不是定義了乙個物件,而是宣告了乙個函式,函式名為date1,函式的返回值為cdate類的物件。

我們已經知道了建構函式是由系統自動呼叫為物件進行初始化工作的,但是既然是初始化,那麼就一定會占用記憶體空間對吧,如果使用malloc分配了一段記憶體空間,該如何釋放呢?這樣就用到了析構函式。它執行一些在物件撤銷前必須執行的清理任務,例如釋放由建構函式申請分配的記憶體等。

析構函式的函式名也是和類名相同,只不過是在類名前邊追加乙個「~」字元作為字首。

class carray

carry::carry(int size)

carry::~carry()

其他函式定義:

void main()

析構函式是在物件的生命週期自動呼叫的,不用在主函式中進行說明,但是得在函式實現的時候寫好實現部分。和建構函式一樣,建構函式在宣告乙個物件的時候也是自動呼叫的把。為了更好的匹配建構函式才加了乙個(10),

建構函式和析構函式都是由系統自動呼叫的,在程式中定義乙個物件,則記憶體為它分配一定的記憶體空間,然後呼叫它的建構函式;當物件生命週期結束時,系統呼叫其析構函式,然後收回物件所使用的記憶體空間。

所有的類中都必須包含由建構函式和析構函式,如果在類中沒有進行定義,則系統會自動為類建立預設的定義。在建立物件時都要進行初始化,因此必須定義建構函式,如果在建構函式中進行了記憶體資源的申請,則必須定義析構函式完成記憶體的釋放,否則可以不定義析構函式。

複製建構函式也是一種建構函式,也是對 物件的初始化操作。其作用就是使用乙個已經存在的物件(由複製建構函式的引數指定的物件),去初始化乙個正在建立的同類物件,歸根結底就是使用乙個已經存在的物件的值去初始化另乙個物件。

其宣告形式為:

class cstr

複製建構函式的形參是本類物件的引用

同建構函式和析構函式一樣,每乙個類都必須有乙個複製建構函式。若類中沒有定義複製建構函式,則系統自動定義乙個預設的複製建構函式。

定義:class cstr

;實現:

cstr::cstr(char *s)

cstr::cstr(cstr &temp)

使用:void main()

C 之建構函式和析構函式

一 建構函式 1 物件的初始化和建構函式 類是一種抽象的資料型別,它不占用儲存空間,不能容納具體的資料。因此在類宣告中不能給資料成員賦初值。例如 錯誤 class complex 與使用變數一樣,使用物件時也應該先定義,後使用。在定義物件時,對資料成員賦初值,稱為初始化。例如 class compl...

C 建構函式和析構函式

1.建構函式是類的一種特殊方法,每次建立類的例項都會呼叫它。在建立乙個類的例項時,建構函式就像乙個方法一樣被呼叫,但不返回值。語法格式 訪問修飾符 類名 特性 1 其名字必須與類名相同,例如 public class myclass 2 不能被直接呼叫,必須通過new運算子來 呼叫。publiccl...

C 建構函式和析構函式

建構函式 class rectangel rectangel int l,int w 這是帶引數的建構函式,建構函式都是沒有返回值,並且和該類同名 int area 這是另一種形式的內聯函式,把宣告和定義寫在一起的也是內聯函式 private int length int width 析構函式 cl...