類的成員變數的初始化順序
類的成員變數的初始化順序只與變數在類中的宣告順序有關,與在建構函式中的初始化列表順序無關。
- 注意:是與宣告順序有關。
#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;
};
相關文章
- c#類的成員初始化順序C#
- 類成員變數的初始化變數
- 淺談Java類中的變數初始化順序Java變數
- C++類的靜態成員變數初始化C++變數
- 探討Java類中成員變數的初始化方式Java變數
- java類初始化的順序Java
- 12-成員變數的初始化變數
- Java初始化靜態變數的時間順序Java變數
- C語言中 struct成員變數順序對記憶體的佔用C語言Struct變數記憶體
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- Java 類初始化順序Java
- Java類初始化順序Java
- c++成員變數初始化C++變數
- 使用類繼承還是類的成員變數繼承變數
- Java子類和父類的初始化執行順序Java
- 子父類中成員變數變數
- Java類(繼承)初始化順序Java繼承
- Python中類變數、成員變數、區域性變數的區別Python變數
- 類的靜態成員變數和普通成員變數該怎樣去區別定義變數
- JAVA物件的初始化順序Java物件
- Java static變數、作用域、建構函式初始化順序Java變數函式
- 成員變數變數
- 總結類初始化時的程式碼執行順序
- JVM類載入機制與類初始化順序JVM
- Java 通過反射獲取類的資訊(成員變數,成員方法,構造方法)Java反射變數構造方法
- Java中class的初始化順序Java
- 關於java的初始化順序Java
- Swift 成員變數的get/setSwift變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- 類,物件,成員變數和區域性變數,匿名物件物件變數
- Java初始化順序Java
- js中同名變數或者引數的優先順序JS變數
- 通過反射獲取類的類名,方法和內部成員變數反射變數
- Java中類的成員方法和變數的訪問許可權Java變數訪問許可權
- 九、 Java程式初始化的順序(二)Java
- 成員變數和區域性變數的區別變數
- MySQL自定義變數執行順序MySql變數
- ansible 變數優先順序示例變數