1. 程式人生 > >c++類的構造函數

c++類的構造函數

規則 sign 就會 顯式 style def 參數 指針 eve

1、構造函數

構造函數的任務是初始化類對象的數據成員,無論何時只要類的對象被創建,就會執行構造函數。

  • 構造函數名與類名相同
  • 沒有返回類型
  • 可以重載
  • 不能聲明成const

(1)合成的默認構造函數

如果我們沒有為類顯式的定義構造函數,編譯器會為我們隱式的定義一個默認構造函數(沒有任何參數)又叫做合成的默認構造函數)這個構造函數按照下面規則初始化類的數據成員:

  1. 如果有類內初始值,用它來初始化成員(比如上面的units_sold=0,revenue=0.0)。類內初始值必須以=或{}表示。
  2. 否則,默認初始化(如bookNo被初始化為空字符串)。

(2)自定義默認構造函數

一般情況下,類都需要定義一個默認構造函數,

主要有以下三個原因:

  1. 一旦定義了其他構造函數,除非我們自己再定義一個默認構造函數,否則這個類將沒有默認構造函數。
  2. 若類中含有內置類型或復合類型(比如數組和指針)的數據,如果沒有提供類內初始值(有的編譯器可能不支持類內初始值),使用合成的默認構造函數的值將是未定義的。
  3. 如果類中包含其他類的對象,而這個對象沒有默認構造函數,那麽編譯器不能為類合成默認構造函數,我們必須自己定義一個默認構造函數。

Sales_data()=default;

函數名與類名相同,沒有參數列表,參數列表後面加上=default要求編譯器生成默認構造函數。

(3)構造函數初始值列表

Sales_data(const string & s,unsigned n,double p):bookNo(s),units_sold(n),revenue(p*n){}

冒號和花括號中間的部分就是構造函數的初始值列表。如果某個數據成員沒有被初始值列表包括,這個值將以與合成默認構造函數相同的方式隱式初始化,對於沒有初始值列表的構造函數,也是以同樣的方式初始化。

2、構造函數初始值列表

(1)必須使用構造函數初始值列表的類型

c++類的構造函數