[轉]C++ 初始化列表的初始化順序

構造函數初始化列表僅用於初始化成員的值,並不指定這些初始化執行的次序。成員被初始化的次序就是定義成員的次序。第一個被定義的成員先被初始化,依次類推。通常,初始化的順序可有可無,然而,若是一個成員是根據其餘成員而初始化,則成員的初始化順序是相當重要的。html

class x {函數

int   i;//聲明順序是先i,後j,故初始化列表中,會先初始化i,在初始化jspa

int   j;htm

public:對象

  x(int  tem): j(tem),i(j){}    //看起來是先初始化j,而後初始化i,其實偏偏相反,先用未初始化的j來初始化i,雖然編譯器不會提示你什麼,可是j未初始化它便由計算機隨即分配的內存存儲,它的值也是隨即的,這個值可能不是你想要的,錯誤就出現了。將ij的聲明順序調過來就沒有問題了。blog

};內存

總的來講,有虛基類時,初始化列表調用構造函數初始化的順序以下:編譯器

1)虛基類的構造函數編譯

2)根據派生類聲明的順序調用派生類的構造函數,對虛基類構造函數的調用被忽略class

3)根據派生類對象聲明的順序調用對象所屬派生類的虛基類構造函數、對象所屬派生類的構造函數

無虛基類時,初始化列表調用構造函數初始化的順序以下:

1)根據派生類聲明的順序調用對象所屬派生類的基類構造函數、接着是派生類的構造函數

2)根據派生類對象聲明的順序調用對象所屬派生類的基類構造函數、對象所屬派生類的構造函數

 

轉自:http://blog.sina.com.cn/s/blog_508938e10102v1es.html

相關文章
相關標籤/搜索