首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 類別成員宣告順序決定初始化順序

     編輯:關於C++

規則

成員初始化順序永遠遵循宣告順序,與建構函式初始化列表寫入順序無關。若初始化列表順序與宣告順序不符,編譯器會發出警告(-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)。
  • 避免成員之間有初始化相依;若必要,重新排序宣告順序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved