class
myclass
對於const資料成員,我們不能像常規的那樣使用建構函式來初始化,也就是不能像下面那麼做。對此,c++提供了特殊的語法來初始化const資料成員—成員初始化列表。
首先,來看看為什麼不能這麼做?
myclass
(int c)
我們都知道const變數一定要在建立的時候初始化:
const
int num =1;
//yes
const
int num;
num =1;
//no
接下來談談在建構函式中為什麼不能使用max = c之類的賦值語句為const成員提供值。
從概念上講,呼叫建構函式時,物件在程式進入建構函式函式體之前被建立。也就是說,呼叫建構函式的時候,先建立物件,再進入函式體。對於myclass()建構函式來說,先為三個成員分配記憶體,然後再進入函式體之心賦值語句。
對於max成員來說,就類似於const int max; max =c;
這對於const成員來說是不行的,const成員應該在分配記憶體的時候進行初始化。對此,c++提供了初始化列表語法來完成這項工作。
使用語法不做詳述。
注意事項:
1,初始值可以是常值或構造函式引數,並且這種方法不限於初始化常量,也可以用於初始化其他成員。
但是引用成員和const成員必須使用這種方法(c++11中提供了更直觀的方式)。普通資料成員既可以使用這種方法,也可以使用普通的方法。
myclass
(int x):a
(0),
b(0)
,max
(x)
或者
myclass
(int x)
:max
(x)
2,只有建構函式可以使用初始化列表語法,另外,引用資料成員與const資料成員必須使用這種語法,因為他們在建立時初始化。
注意:不能將初始化列表語法用於其他類方法。
c++11提供了更直觀的方式進行初始化。
class myclass
;
這與在建構函式中使用初始化列表語法等價。
如果classy是乙個累,而mem1、mem2、mem3都是這個類的資料稱源,則類建構函式可以使用如下的語法來初始化資料成員:
classy::
classy
(int n,
int m)
:mem1
(n),
mem2(0
),mem3
(n*m +2)
上述**將mem1初始化為n,將mem2初始化為0,將mem3初始化為n*m+2。從概念上說,這些初始化工作是在物件建立時完成的,此時還未執行括號中的任何**。請注意以下幾點:
* 這種格式只能用於建構函式
* 必須用這種格式來初始化非靜態const資料稱源(至少在c++11之前是這樣的);
* 必須用這種格式來初始化引用資料稱源。
資料成員被初始化的順序與它們出現在類宣告中的順序相同,與初始化器中的排列順序無關。
c 中的成員初始化列表語法
class myclass private int a int b const int max 對於const資料成員,我們不能像常規的那樣使用建構函式來初始化,也就是不能像下面的e.g那麼做。對此,c 提供了特殊的語法來初始化const資料成員 成員初始化列表。首先,來看看為什麼不能這麼做?e.g...
C 成員初始化列表的語法
如果classy是乙個累,而mem1 mem2 mem3都是這個類的資料稱源,則類建構函式可以使用如下的語法來初始化資料成員 classy classy int n,int m mem1 n mem2 0 mem3 n m 2 上述 將mem1初始化為n,將mem2初始化為0,將mem3初始化為n ...
成員初始化列表
類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...