構造函數初始化列表僅用於初始化成員的值,並不指定這些初始化執行的次序。成員被初始化的次序就是定義成員的次序。第一個被定義的成員先被初始化,依次類推。通常,初始化的順序可有可無,然而,若是一個成員是根據其餘成員而初始化,則成員的初始化順序是相當重要的。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未初始化它便由計算機隨即分配的內存存儲,它的值也是隨即的,這個值可能不是你想要的,錯誤就出現了。將i和j的聲明順序調過來就沒有問題了。blog
};內存
總的來講,有虛基類時,初始化列表調用構造函數初始化的順序以下:編譯器
1)虛基類的構造函數編譯
2)根據派生類聲明的順序調用派生類的構造函數,對虛基類構造函數的調用被忽略class
3)根據派生類對象聲明的順序調用對象所屬派生類的虛基類構造函數、對象所屬派生類的構造函數
無虛基類時,初始化列表調用構造函數初始化的順序以下:
1)根據派生類聲明的順序調用對象所屬派生類的基類構造函數、接着是派生類的構造函數
2)根據派生類對象聲明的順序調用對象所屬派生類的基類構造函數、對象所屬派生類的構造函數
轉自:http://blog.sina.com.cn/s/blog_508938e10102v1es.html