C++ 類中的static成員的初始化和特點
#include <iostream> using namespace std; class Test { public: Test() : y(1), r(y), d(3){} //對於常量型成員變量和引用型成員變量,必須通過參數化列表的方式進行初始化。 ~Test(){} int y; //普通變量成員 int &r; //引用成員變量 const int d; //常量成員變量 static int c; //靜態成員變量 static const int x = 2.1; //靜態常量整型成員變量 static const int xx; //靜態常量整型成員變量聲明 static const double z; //靜態常量非整型成員變量聲明 static const float zz = 6.6; //靜態常量非整型成員變量 }; const int Test::xx = 4; //靜態常量整型成員變量定義 const double Test::z = 5.1; ////靜態常量非整型成員變量定義 int Test::c = 2; int main(void) { cout << Test::x << endl; return 0; }
這些特殊類型的成員變量主要有:
1. 引用
2. 常量
3. 靜態變量
4. 靜態整型常量
5. 靜態非整型常量
對於==1. 引用==和==2. 常量==,成員變量必須通過構造函數的==參數列表==的方式初始化。例如:上述程序中的r 和 d 變量的初始化。
對於==3. 靜態變量==,static成員變量需要在類定義體外進行初始化與定義,因為static數據成員獨立該類的任意對象存在,它是與類關聯的對象,不與類對象關聯。例如:上述程序中的c變量的初始化。
對於==4. 靜態整型常量==,該類型成員可以直接在類中初始化,也可以在類中聲明,在類定義體外進行定義。例如:上述程序中的x和xx變量。
對於==5. 靜態非整型常量==,該類型也是可以在類中聲明在類定義體外進行定義,或者直接在類中定義初始化。例如:上述程序中的z和zz變量。
結論:
靜態成員屬於類作用域,但不屬於類對象,它的生命周期和普通的靜態變量一樣,程序運行時進行分配內存和初始化,程序結束時則被釋放。所以不能在類的構造函數中進行初始化。
static成員的優點
static成員的名字是在類的作用域中,因此可以避免與其它類成員或全局對象名字沖突。
可以實施封裝,static成員可以是私有的,而全局對象不可以。
閱讀程序容易看出static成員與某個類相關聯,這種可見性可以清晰地反映程序員的意圖。
static成員函數特點
因為static成員函數沒有this指針,所以靜態成員函數不可以訪問非靜態成員。
非靜態成員函數可以訪問靜態成員。
靜態數據成員與類的大小無關,因為靜態成員只是作用在類的范圍而已。