構造函數與析構函數(讀書筆記)

構造函數與析構函數(讀書筆記)

一.    構造函數:

1.基本概念:

(1)   類的數據成員是不能在聲明類時初始化的,如果一個類中所有的成員都是公用的,則可以在定義對象時對數據成員進行初始化,反之,如果數據成員是私有的,或者類中有privateprotected的成員,就不能用這種方法初始化。

(2)   作用:處理對象的初始化。構造函數是一種特殊的成員函數,與其他成員函數不同,不需要用戶來調用它,而是在建立對象時自動執行。

(3)   構造函數的名字必須與類名同名,而不能由用戶任意命名,以便編譯系統能識別它並把它作爲構造函數處理。

(4)   它不具有任何類型,不返回任何值。構造函數的功能是由用戶定義的,用戶根據初始化的要求設計函數體和函數參數。

(5)   如果用戶自己沒有定義構造函數,則C++系統會自動生成一個構造函數,只是這個構造函數的函數體是空的,也沒有參數,不執行初始化操作.

(6)   構造函數不需用戶調用,也不能被用戶調用。

2.帶參數的構造函數:

 1)作用:在調用不同對象的構造函數時,從外面將不同的數據傳遞給構造函數,以實現不同的初始化。

2)構造函數首部的一般格式爲

構造函數名(類型 1 形參1,類型2 形參2…)

3)用戶是不能調用構造函數的,因此無法採用常規的調用函數的方法給出實參。實參是在定義對象時給出的。定義對象的一般格式爲

類名 對象名(實參1,實參2…);

3.用參數初始化表對數據成員初始化

定義構造函數可以改用以下形式:

BoxBox(int h,int w,int len):height(h)width(w)length(len){ }

4.使用默認參數的構造函數

1)構造函數中參數的值既可以通過實參傳遞,也可以指定爲某些默認值,即如果用戶不指定實參值,編譯系統就使形參取默認值。

2)應該在聲明構造函數時指定默認值,而不能只在定義構造函數時指定默認值。

3)在一個類中定義了全部是默認參數的構造函數後,不能再定義重載構造函數。

 

二.析構函數:

1.基本概念:

1)析構函數是與構造函數作用相反的函數。

2)當對象的生命期結束時,會自動執行析構函數。具體地說如果出現以下幾種情況,程序就會執行析構函數:

①如果在一個函數中定義了一個對象(它是自動局部對象),當這個函數被調用結束時,對象應該釋放,在對象釋放前自動執行析構函數。

static局部對象在函數調用結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時,才調用static局部對象的析構函數。

③如果定義了一個全局對象,則在程序的流程離開其作用域時(main函數結束或調用exit函數) 時,調用該全局對象的析構函數。

④如果用new運算符動態地建立了一個對象,當用delete運算符釋放該對象時,先調用該對象的析構函數。

3)析構函數不返回任何值,沒有函數類型,也沒有函數參數。因此它不能被重載。一個類可以有多個構造函數,但只能有一個析構函數

4)實際上,析構函數的作用並不僅限於釋放資源方面,它還可以被用來執行用戶希望在最後一次使用對象之後所執行的任何操作

三.調用構造函數和析構函數的順序

1.在一般情況下,調用析構函數的次序正好與調用構造函數的次序相反

2.在全局範圍中定義的對象(即在所有函數之外定義的對象),它的構造函數在文件中的所有函數(包括main函數)執行之前調用。但如果一個程序中有多個文件,而不同的文件中都定義了全局對象,則這些對象的構造函數的執行順序是不確定的。當main函數執行完畢或調用exit函數時(此時程序終止),調用析構函數。

3.如果定義的是局部自動對象(例如在函數中定義對象),則在建立對象時調用其構造函數。如果函數被多次調用,則在每次建立對象時都要調用構造函數。在函數調用結束、對象釋放時先調用析構函數。

4.如果在函數中定義靜態(static)局部對象,則只在程序第一次調用此函數建立對象時調用構造函數一次,在調用結束時對象並不釋放,因此也不調用析構函數,只在main函數結束或調用exit函數結束程序時,才調用析構函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章