1、類成員不可以在定義時初始化
2、const類型的成員必須在初始化化列表進行初始化;一般變量在在初始化列表中初始化的順序決定於定義的順序
#include<iostream> using namespace std; class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2: " << n2 <<endl; } }; int main() { A a; a.Print(); getchar(); return 1; }
3、static類型的成員變量需要在類外進行初始化
原因: 在類中,只是聲明了靜態變量,並沒有定義。 2. 聲明只是表明了變量的數據類型和屬性,並不分配內存;定義則是需要分配內存的。 注意:如果在類里面這么寫int a; 那么是既聲明了變量,也定義了變量,兩者合在一起了。 3. 靜態成員是“類級別”的,也就是它和類的地位等同,而普通成員是“對象(實例)級別”的。類級別的成員,先於該類任何對象的存在而存在,它被該類所有的對象共享。 4. 現在,咱們假定要實例化該類的一個對象,那么會發生什么事情呢?靜態成員肯定要出現在這個對象里面的,對吧?這時候才去定義那個靜態成員嗎?這顯然是不合適的。因為,比如有另外一個線程也要創建該類的對象,那么也要按照這個方式去定義那個靜態成員。這會產生兩種可能的情況:1. 重復定義;2. 就算不產生重復定義的情況,也會產生競爭,從而造成死鎖的問題,以至於對象無法創建。很顯然,編譯器不能這么干。那么很合理的解決辦法,就是事先在類的外部把它定義好,然后再供所有的對象共享。 注意:類的靜態常量成員可以類內初始化
列子:
#include <iostream.h>
class CDummy
{
public:
static int n; //這里只是聲明
};
int CDummy::n=9; //這里是定義加初始化
void main()
{
cout < <CDummy::n < <endl;
}
上面這樣完全沒問題,但是不能直接在類中初始化,比如:
static int n=9;
4、static的常量可以在類中進行初始化
class A
{
private:
static const int a = 0; //正確
static const char b = 'b'; //正確
const int c = 0; //錯誤,非static const不能在類里面初始化
static const int d[10] = {0}; //錯誤,只有一般數據類型的static const才能在類里面初始化。
//數組應該在.cpp文件里面初始化
}
初始化順序總結為:
- 1基類的靜態變量或全局變量
- 2派生類的靜態變量或全局變量
- 3基類的成員變量
- 4派生類的成員變量