C 建構函式初始化列表

2021-06-27 14:46:23 字數 1277 閱讀 2401

建構函式初始化列表是乙個重要的概念,這一步是建構函式執行時無論如何也要走的一步。建構函式可以說成三部分構成,1)引數列表; 2)初始化列表; 3) 函式體。其中初始化列表是可選的。在一定情況下不需要初始化列表。以下是c++ primer上面的一段**:

sales_item::sales_item(const string &book):

isbn(book), units_sold(0), revenue(0.0) {}

初始化列表是指:以冒號開始 並在函式塊開始大括號開始前的一段**,均有資料成員及其初始化參值組成,初始化值在緊隨其後的圓括號中。

初始化列表是必須的,在以下情況:

const 成員

引用成員

無缺省建構函式的類型別成員

解釋上面的三種情況之前,先描述下c++ primer上面的幾點重要的概念:

建構函式分兩個階段進行:初始化階段、計算階段。 初始化階段只初始化列表或者未指定初始化列表,由建構函式隱式初始化的過程。 計算階段是指執行建構函式函式體裡面賦值函式的部分。

不管成員是否在建構函式初始化列表中顯示的初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段之前。

在建構函式函式體(花括號裡面的賦值**)中的**,僅僅是賦值,而不是初始化!不給定初始化列表初始化,由建構函式隱式的呼叫預設建構函式初始化。

有了上面三點,就知道了函式體裡面只能是賦值,const和引用是不能賦值的,僅在初始化的時候給定初值然後不能改變。因此沒有初始化列表是不行的。同理,不給出初始化列表,類型別成員需要初始化,就需要隱式的執行預設建構函式,但是沒有預設建構函式,初始化就會失敗,這種情況下,只能要初始化列表來進行初始化。

只有初始化列表才能做初始化,建構函式的函式體只是進一步的賦值改變內容而已。

這裡順便回顧下兩個概念,初始化和賦值。「=」在某些情況下可以作為賦值,在某些情況下可以作為初始化。

情形1:等號作為初始化

datatype a;//定義類型別變數a,預設建構函式

datatype b = a;//這裡等號是初始化

情形2:等號作為賦值

datatype a,b;

a = b;//單純的賦值

總結起來: 定義的時候等號就是初始化,只有賦值那麼等號就只是賦值。

另外兩點需要注意的是:

1、內建資料型別,是不會被隱式初始化的,所以在函式體裡面和在初始化列表中是沒有區別的。

2、初始化列表成員出現的順序與成員被初始化的順序無關,只與成員在類中定義的順序有關。

C 建構函式 ,初始化列表

c 中的類的建構函式 1.如果類中沒有定義建構函式,編譯器將生成乙個預設建構函式,這個預設建構函式會呼叫類中所有成員的預設建構函式,但不會對如int,double的基本資料型別做初始化 2.類中可以定義多個建構函式,但每個建構函式應該有不同的引數實現 3.預設建構函式必須定義的情況,當需要定義乙個物...

C 建構函式初始化列表

從概念上講,可以認為建構函式分兩個階段進行 1.初始化階段 2.普通的計算階段。計算階段由建構函式函式體中的所有語句組成 不管成員是否在建構函式初始化列表中顯示初始化,類型別的資料成員總是在初始化階段初始化。初始化發生在計算階段的開始之前。建議 使用建構函式初始化列表 注 必須對任何const或引用...

C 建構函式初始化列表

建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exam...