4.類和對象(2)
文章目錄
- 4.類和對象(2)
- 類的六個默認成員函數
- (1)構造函數:
- 構造函數特點
- 含有缺省參數的構造函數
- 構造函數特點(續)
- 注意事項
- 構造函數補充
前面總結了有關對象概念,對比 C 與 C++ 編程范式;講解類定義、訪問限定、作用域、實例化;說明類存儲大小含內存對齊,即便無成員變量也占 1 字節;還闡述 this 指針特性,它是成員函數隱式形參。忘記了就回去看
類和對象(1)
類的六個默認成員函數
空類并不是什么都沒有,在用戶沒有顯式實現的情況下,編譯器會默認生成六個成員函數。
(1)構造函數:
構造函數的函數名與類名相同,在實例化類類型對象時自動調用,并且在對象的生命周期內只調用一次,構造函數的主要作用是初始化對象,而不是創建對象
構造函數特點
1.構造函數的函數名與類名相同
2.沒有返回值,不寫void
3.構造函數在對象實例化后自動調用
4.支持函數重載(函數重載的規則與之前學的內容一致)可以使用缺省參數
特別要注意:構造函數雖然是在對象實例化時編譯器自動調用該函數。但不可以把構造函數放在private或protect中
含有缺省參數的構造函數
在這種情況下我們可以在對象實例化時進行傳參,注意:這里是傳參,并不是將對象進行初始化,要與結構體初始化區分開來,這里傳參使用小括號”()”不是用”{ }”
構造函數特點(續)
-
如果用戶沒有顯式定義構造函數,C++編譯器會自動生成一個無參的構造函數,但如果用戶生成了編譯器不再會自動生成
-
對于編譯器自動生成的構造函數,有如下的作用:
1>該構造函數不會對編譯器內置類型對象(int,float,double,char…)進行處理2>該構造函數會對自定義類型調用它的默認構造函數(注意默認構造函數與其他的構造函數在使用上有很大的區別,在后面會詳細說),如果該自定義類型沒有默認的構造函數,編譯器會報錯
注意事項
-
如果該自定義類型的構造函數為全缺省參數,編譯器不會報錯,當構造函數的參數中存在非缺省參數時,編譯器會報錯
-
無參的構造函數和全缺省的構造函數都稱為默認構造函數,并且一個類中默認構造函數只能有一個。
-
無參構造函數、全缺省構造函數,我們沒寫編譯器默認生成的構造函數,都可以認為是默認構造函數
構造函數補充
- 一個類中默認構造函數只能有一個
- 一定要注意默認構造函數與普通構造函數的區別
- 實踐中的總結
- 1>一般情況下,構造函數都需要我們自己去定義。
- 2>當一個類中沒有內置類型成員變量,只有自定義類型變量時,我們可以對這個類不寫構造函數,它會逐層調用其他自定義類型成員變量的構造函數
Q:關于編譯器生成的默認成員函數,很多人會有疑惑:不實現構造函數的情況下,編譯器會生成默認的構造函數。但是看起來默認構造函數又沒什么用?對象調用了編譯器生成的默認構造函數,但是d對象_year/_month/_day,依l日是隨機值。也就說在這里編譯器生成的默認構造函數并沒有什么用??
A:C++把類型分成內置類型(基本類型)和自定義類型。內置類型就是語言提供的數據類型,如:int/char…,自定義類型就是我們使用class/struct/union等自己定義的類型,看看下面的程序,就會發現編譯器生成默認的構造函數會對自定類型成員_t調用的它的默認成員函數。
注意:
- C++11中針對內置類型成員不初始化的缺陷,又打了補丁,即:內置類型成員變量在類中聲明時可以給默認值。
- 當我們自己寫了構造函數(無論是否為默認的構造函數),編譯器就不會自動生成默認的構造函數了,要么自己補充,要么使用關鍵字default強制編譯器自動生成
- 在定義類中成員變量是進行變量聲明并給出缺省值,而不是進行實例化后進行初始化,看起來非常像,但要注意區分。這里是給聲明一個默認值(缺省值),當有其他值時不會使用該缺省值,包括構造函數