建構函式詳解

2021-07-23 04:59:00 字數 3250 閱讀 3771

類的六個預設函式:

(一)建構函式的定義:

一種特殊的成員函式,主要用於為物件分配空間,進行初始化。建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。

eg:定義乙個date的建構函式

#includeusing namespace std;

class date

;date::date()//定義建構函式date

;date::date(int year,int month,int day)//定義建構函式date

:_year(year)//成員初始化列表

,_month(month)

,_day(day)

{}void date::setdate(int year,int month,int day)

void date::showdate()

;time::time(int hour,int minute,int second)

{}class date

;date::date(int year,int month,int day)//定義建構函式date()

int main()

錯誤顯示:

用成員初始化列表對time類的物件t進行初始化

#includeusing namespace std;

class time

;time::time(int hour,int minute,int second)

{}class date

;date::date(int year,int month,int day)//定義建構函式date()

3,成員初始化順序

<1>每個成員只能在初始化列表中出現一次。(為什麼?)

從上圖可以看出每個成員只能初始化一次,如果初始化多次,則會出現以上錯誤或者下面的錯誤,請看下文。

<2>類成員是按照他們在類裡被宣告的順序進行初始化的,與他們在成員初始化列表中         列出的順序無關。

資料成員在類中定義順序就是在引數列表中的初始化順序。

<3>盡量避免使用成員初始化成員,成員的初始化順序最好和成員的定義順序保持一致.

由於<2>的原因,如果使用還未初始化的成員初始化其他成員,則會出錯。

#includeusing namespace std;

class date

;date::date(int year,int month,int day)//定義建構函式date()

:_year(_month)

,_month(_day)

,_day(day)

{}void date::showdate()

{ cout<<_year>"<<_month>"<<_day>

(三)建構函式的作用:

1,構建物件,如上述例子。

2,初始化物件。

3,型別轉換。(當類的建構函式只有乙個引數)

#includeusing namespace std;

class date

{public:

date(int year)//宣告建構函式date的原型

仔細觀察上圖,你會發現主函式中將2016的值賦給乙個類型別的物件,而程式卻沒出錯還執行出了結果,其中其實編譯器已經將整數型別隱式轉換為該類的物件,只是我們沒有察覺而已。

如何防止它隱式轉換呢?

【explcit】

用explicit修飾建構函式,抑制由建構函式定義的隱式轉換,explicit關鍵字類內部的構建宣告上,在類的定義體外部的定義上不再重複。

再看下加上explicit之後**的情況:

(四)預設建構函式

1,定義:就是沒有顯示提供初始化時呼叫的建構函式,它由不帶引數的建構函式或者所 以的形參都有預設引數的建構函式組成。

2,具體細節:

<1>類如果沒有顯式定義建構函式時,編譯器會合成乙個預設的建構函式,該建構函式中什麼工作都不做,稱為合成的建構函式。編譯器生成的預設建構函式使用與變數初始化相同的規則來初始化成員,具有類型別的成員通過執行各自的預設建構函式來進行初始化。

<2>只要顯式定義了,即使該建構函式什麼也不做,編譯器也不會為該類合成預設的建構函式。

<3>如果類中包含內建或復合型別的成員,則該類就不應該依賴於合成的預設建構函式,它應該定義自己的建構函式成員來初始化這些成員。因為內建和復合型別的成員如指標、陣列,只對定義在全域性作用域中的物件初始化,當物件定義在區域性作用域時,內建和符合型別的成員不進行初始化。在某些情況下,預設建構函式是由編譯器隱式使用的。

(五)建構函式的特性

1,函式名必須與類名相同。

2,建構函式沒有返回值。

3,建構函式有初始化列表(可以不用)。

4,一旦新物件被建立,由編譯器自動呼叫,且在物件的生命週期內只呼叫一次。

5,建構函式可以過載,實參決定要呼叫哪個建構函式。

6,如果沒有顯示定義時,編譯器會在適當的時候提供乙個預設的建構函式出來。但只        要顯示定義,編譯器將不會分配新的建構函式。

7,無參建構函式和帶有預設值的建構函式被認為是預設建構函式,並且預設建構函式        只能有乙個。

8,建構函式不能用const來修飾。

建構函式詳解

建構函式是類中的乙個特殊成員函式,它一般為公有的。在特殊的情況下它可能為私有的。此時這個類將會無法新建物件。當有乙個物件被新建時,建構函式會被自動的呼叫,這種機制能夠確保正確的初始化。在乙個空類中,建構函式是預設生成的。但如果我們寫了乙個建構函式之後,便不會再生成預設的建構函式。一般的,在建立物件的...

建構函式詳解

一 建構函式的原理 記住當使用new的時候,到底發生了什麼事情,在使用new操作符來呼叫乙個建構函式的時候,發生了什麼呢?其實很簡單,就發生了四件事 第一行,建立乙個空物件obj。第二行,將這個空物件的 proto 成員指向了建構函式物件的prototype成員物件,這是最關鍵的一步,具體細節將在下...

建構函式詳解

作用 構造方法用來初始化類的物件,與父類的其他成員不同,它不能被子類所繼承 子類可以繼承父類所有的public成員方法和變數,但不能繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯示的建構函式,編譯器會給乙個預設的建構函式,並且該...