類的成員變數的初始化順序

傻月菇涼發表於2018-09-03
  • 類的成員變數的初始化順序只與變數在類中的宣告順序有關,與在建構函式中的初始化列表順序無關

    • 注意:是與宣告順序有關。
#include<iostream>

using namespace std;

class A {
public:
    //我們原意是先初始化b,再用b初始化a。
    //但結果可以看出,類的成員變數的初始化順序與宣告順序有關,先初始化的a,再初始化的b。
    A(int val):b(val),a(b){}
public:
    int a;
    int b;
};

int main(int argc, char* argv[]) {
    A A1(10);
    cout << A1.a << endl;
    cout << A1.b << endl;
    getchar();
    return 0;
}

這裡寫圖片描述

  • 靜態成員變數先於例項變數,父類成員變數先於子類成員變數,父類建構函式先於子類建構函式。

  • 從全域性看,變數的初始化順序如下(重要!!!):

    • 基類的靜態變數或全域性變數。
    • 派生類的靜態變數或全域性變數。
    • 基類的成員變數。
    • 派生類的成員變數。

擴充套件:初始化列表和建構函式初始化的區別

  • 初始化列表一般為:
A1(int a):a(a){}
  • 建構函式初始化一般為:
A1(int a) {
    this->a = a;
}
  • 很多場合必須使用帶有初始化列表的建構函式。例如,const成員或引用型別的成員,因為const物件或者引用型別只能初始化,不能對他們賦值。(重要!!!)

  • 正確

class A1 {
    A1(int a,int val):a(a),b(val) {}
private:
    const int a;
    int& b;
};
  • 錯誤
class A1 {
    A1(int a,int val) {
        this->a=a;
        b=val;
    }
private:
    const int a;
    int& b;
};

相關文章