建構函式和析構函式

2021-07-16 20:08:03 字數 1418 閱讀 9985

1.建構函式

①建構函式是一種特殊的成員函式,在c++的類中,它的名字和類名相同,沒有返回值,不需要使用者呼叫(使用者也不能呼叫),而是在建立物件時自動執行。建構函式的作用是在建立物件時進行初始化工作,最常見的就是對成員變數賦值。(c++類中如果不加識別符號public,則整個類預設私有,而c語言結構體預設公有)

舉個例子

#include using namespace std;

class student;

//定義建構函式

student::student(char *name1, int age1, float score1)

//定義普通成員函式

void student::say();

乙個類,必須有建構函式,要麼使用者自己定義,要麼編譯器自動生成。一旦使用者自己定義了建構函式,不管它是 public 屬性的,還是 private、protected 屬性的,編譯器都不再自動生成。上面的 student 類,只有乙個建構函式,就是我們自己定義的。

實際上,編譯器只有在必要的時候才會生成預設建構函式,而且它的函式體一般不為空。預設建構函式的目的是幫助編譯器做初始化工作,而不是幫助程式設計師。這是c++的內部實現機制,這裡不再深究,初學者可以按照上面說的「一定有乙個空函式體的預設建構函式」來理解。

2.析構函式

建立物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷毀物件時系統也會自動呼叫乙個函式來進行清理工作,這個函式被稱為析構函式。

析構函式也是一種特殊的成員函式,函式名和類名相同,也沒有返回值,不需要使用者呼叫,而是在銷毀物件時自動執行。與建構函式不同的是,析構函式的名字是在類名前面加乙個」~「符號。

注意:析構函式沒有引數,不能被過載,因此乙個類只能有乙個析構函式。如果使用者沒有定義,那麼編譯器會自動生成。

析構函式在 main 函式執行結束前被執行,並且呼叫順序和建構函式正好相反。析構函式在物件被銷毀前執行,要知道析構函式什麼時候被呼叫,就要先知道物件什麼時候被銷毀。

物件可以認為是通過類這種資料型別定義的變數,它的很多特性和普通變數是一樣的,例如作用域、生命週期等。由此可以推斷,物件這種變數的銷毀時機和普通變數是一樣的。

總結起來,有下面幾種情況:

1) 如果在乙個函式中定義了乙個物件(auto 區域性變數),當這個函式執行結束時,物件就會被銷毀,在物件被銷毀前自動執行析構函式。

2) static 區域性物件在函式呼叫結束時並不銷毀,因此也不呼叫析構函式,只有在程式結束時(如 main 函式結束或呼叫 exit 函式)才呼叫 static 區域性物件的析構函式。

3) 如果定義了乙個全域性物件,也只有在程式結束時才會呼叫該全域性物件的析構函式。

4) 如果用 new 運算子動態地建立了乙個物件,當用 delete 運算子釋放該物件時,先呼叫該物件的析構函式。

注意:析構函式的作用並不是刪除物件,而是在撤銷物件占用的記憶體之前完成一些清理工作,使這部分記憶體可以分配給新物件使用。

建構函式和析構函式

建構函式沒有返回值,不能被顯示的呼叫。它是在定義物件時由系統自動執行的,而且只執行一次。如果沒有定義建構函式,系統會自動生成乙個建構函式,只是這個建構函式的函式體是空,沒有引數,也不執行任何初始化的操作。帶引數的建構函式 有一種簡練,方便的寫法 建構函式的引數初始化表 box int h,int w...

析構函式和建構函式

每個物件生成的時候都要完成物件的初始化,如設定屬性的初始值。c 中規定每個類都有乙個初始值,如果沒有,系統會產生乙個預設的建構函式。這個建構函式沒有任何引數,不做任何額外的工作。但往往我們會自己寫乙個建構函式,用來進行特殊的初始化工作。這樣的話,編譯器就不會再為其生成預設的建構函式。class 類名...

建構函式和析構函式

stock hot 因為資料部分的訪問狀態是私有的,程式不能訪問資料成員。建立stock的建構函式,由於需要為stock提供3個值,因此應為建構函式提供3個引數值,程式設計師可能指向設定company成員,而其他的設定為0 使用預設引數完成 宣告如下 stock const char co,int ...