成員初始化順序永遠遵循宣告順序,與建構函式初始化列表寫入順序無關。若初始化列表順序與宣告順序不符,編譯器會發出警告(-Wreorder),且可能導致使用未初始化的成員初始化其他成員。
/* BInsertSort.cpp
* Created on: 2014年4月15日
* Author: Spike
*/
#include <iostream>
#include <string>
using namespace std;
class base {
private:
int m_i;
int m_j;
public:
base(int i) : m_j(i), m_i(m_j) {} // 宣告順序 m_i, m_j;實際先初始化 m_i(用 m_j 未初值) 再 m_j
base() : m_j(0), m_i(m_j) {}
int get_i() { return m_i; }
int get_j() { return m_j; }
};
int main() {
base obj(98);
cout << obj.get_i() << endl << obj.get_j() << endl;
return 0;
}
4202398 // m_i 為亂數(m_j 尚未初始化)
98 // m_j 正確為 98
class base {
private:
int m_i;
int m_j;
public:
base(int i) : m_i(i), m_j(i) {} // 或依宣告順序:m_i(i), m_j(m_i)
// ...
};
-Wreorder(GCC/Clang)或 /Wall(MSVC)。