建構函式和析構函式

2021-09-22 13:53:31 字數 4363 閱讀 2318

建構函式

**演示:

#include

using std :

: cout;

using std :

: endl;

class

date

void

print()

private

: int _year;

int _month;

int _day;};

int main()

輸出結果為:

注意:如果物件沒有初始化就直接使用會接出錯,為了避免這種情況,所以每個類都會有乙個預設的建構函式,使得類一旦被定義出來,就已經完成了初始化,並且建構函式可以自動生成,也可以自己建立

1.1建構函式的特性:

建構函式是特殊的成員函式,需要注意的是,建構函式的雖然名稱叫構造,但是需要注意的是建構函式的主 要任務並不是開空間建立物件,而是初始化物件。

具體特徵如下:

無返回值

函式名與類名相同

**物件例項化時編譯器自動呼叫對應的建構函式。 **

建構函式可以過載

**演示:

#include

using std :

: cout;

using std :

: endl;

class

date

//2.有參建構函式

date

(int year, int month, int day)

void

print()

private

: int _year;

int _month;

int _day;};

int main()

輸出結果為:

如果類中沒有顯式定義建構函式,則c++編譯器會自動生成乙個無參的預設建構函式,一旦使用者顯式定 義編譯器將不再生成

**演示:

#include

using std :

: cout;

using std :

: endl;

class

date

*/void

print()

private

: int _year;

int _month;

int _day;};

int main()

輸出結果為:

注意:此時的結果竟然是隨機數,這是什麼原因呢?在我們自己沒有建立建構函式的情況下,編譯器應該會預設生成乙個建構函式,但是很明顯d1並沒有進行初始化,難道是編譯器沒有預設生成建構函式嗎?其實不是的,在我們自己沒有建立建構函式的情況下,編譯器其實預設生成了乙個建構函式,但是由於它的乙個特性,所以並沒有初始化他的成員變數

編譯器自己預設生成的建構函式只會初始化自定義型別成員變數,不會初始化內建型別的成員變數(內建型別就是語法已經定義好的型別:如 int/char…,自定義型別就是我們使用class/struct/union自己定義的型別)

**演示:

#include

using std:

:cout;

using std:

:endl;

class

date2

private

: int _year;

int _month;

int _day;};

class

date1

private

: int _year;

int _month;

int _day;

date2 d2;};

int main()

輸出結果為:

注意:很明顯編譯器預設生成的建構函式會對自定型別成員變數呼叫的它的預設成員函式,但是對內建變數則不會進行初始化以及其它操作,所以當乙個類的成員變數是內建型別的時候,則必須要自己建立乙個建構函式來進行初始化

7.無參的建構函式和全預設的建構函式都稱為預設建構函式,並且預設建構函式只能有乙個。注意:無參 建構函式、全預設建構函式、我們沒寫編譯器預設生成的建構函式,都可以認為是預設成員函式

**演示:

#include

#include

using std:

:cout;

using std:

:endl;

class

date

date

(int year =

1990

, int month =

1, int day =1)

void

print()

private

: int _year;

int _month;

int _day;};

int main()

輸出結果:會報錯,原因是出現了二義性,因為全預設建構函式和無引數建構函式在主函式裡面呼叫的時候都不需要實參,所以當這二者都出現在類裡面的時候,在呼叫函式的時候就不知道到底呼叫哪個

析構函式

與建構函式功能相反,析構函式不是完成物件的銷毀,區域性物件銷毀工作是由編譯器完成的。而物件在銷毀時會自動呼叫析構函式,完成類的一些資源清理工作

2.1析構函式的特性:

**析構函式名是在類名前加上字元 ~ **

無引數無返回值

乙個類有且只有乙個析構函式。若未顯式定義,系統會自動生成預設的析構函式

物件生命週期結束時,c++編譯系統系統自動呼叫析構函式

**演示:

#include

using std:

:cout;

using std:

:endl;

typedef int sldatetype;

class

sqlist

~sqlist()

}private

: int* _pdate;

int _size;

int _capacity;

};

注意:當類的成員函式有在堆上申請空間的時候,則必須要自己建立乙個析構函式用來釋放空間避免記憶體洩漏,當類裡面沒有在堆上申請空間的時候,則沒有必要自己建立析構函式,編譯器自己預設建立的析構函式就可以清理資源,因為所有的成員變數和成員函式都是在棧上建立的空間,當函式執行完後,由於棧幀的原因,在棧上開闢的所有空間都會被系統自己清理掉編譯器生成的 預設析構函式,會對自定型別成員呼叫它的析構函式**演示:

#define _crt_secure_no_warnings

#include

#include

#include

using std:

:cout;

using std:

:endl;

class

string

~string()

private

: char* _str;};

class

str;

int main()

輸出結果為:

建構函式和析構函式

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

析構函式和建構函式

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

建構函式和析構函式

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