•
所以靜態成員資料也稱為類資料,靜態成員函式也稱為類方法。靜態成員資料在類裡只是乙個說明,還需要乙個定義(或叫初始化)。靜態成員資料要在類定義之外被初始化(要用類名限定修飾),而且程式裡只能提供一次,所以初始化不能放在標頭檔案裡。
例1:
class test
};
//error: 'int test::k' is a static data member; it can only be initialized at its definition
例2:
c++規定const靜態類成員可以直接初始化,其他非const的靜態類成員需要在類宣告以外初始化,我們一般選擇在類的實現檔案中初始化。
int test::k;
預設初始化為0;
也可自己指定:
int test::k(20);
class test;
int test::k;
int main()
•
在inline
函式裡不要使用靜態成員資料,因為編譯器不能保證此時靜態成員資料已初始化。
class test
};int test::k(20);
int main()
class a
a & _e3;
a * _e1;
static a _e;
a _e2; // error c2460: '_e2' : uses 'a', which is being defined
};
•靜態成員資料與全域性變數的比較:靜態成員資料不論類由多少例項,它都只有乙個拷貝,這和全域性變數類似。但靜態成員資料有個作用域名字,而且不一定是
public的。
•靜態成員函式不能宣告為
const
和volatile。
•靜態成員函式和友元函式比較:靜態成員函式和友元函式都沒有隱含的
this
指標,且都能訪問類的
private
和protected
部分。但靜態成員函式有個作用域名字,而且不一定是
public的。
•const
靜態成員資料:在有些
c++編譯器裡,有序型的(如
int,unsigned
long,char
等)const
靜態成員資料可以
在類裡對其初始化。
•靜態成員資料初始化次序:靜態初始化成員資料次序和類作用域的靜態物件、檔案作用域和名字空間作用域的物件的生存週期有關。當在不同編譯單元(即
.cpp
檔案)的靜態初始化有次序依賴,這就有可能有危險。解決的辦法將靜態成員資料轉換為靜態成員函式。 •
volatile:
當乙個物件的值可能會在編譯器的控制或監視之外被改變,那該物件應該宣告為
volatile
。 此時編譯器執行的一些例行優化對它不能應用。
volatile
也可以修飾類成員函式。對於
volatile
類物件它只能呼叫
volatile
成員函式、建構函式和析構函式。
static靜態修飾符
靜態成員歸整個類所有,不依賴類特定的例項,是被類的所有例項共享。只要這個類被jvm載入,就可以根據類名在全域性資料區域內找到它們。因此,靜態成員可以在任何物件建立之前訪問而無需訪問物件。static關鍵字修飾的成員變數稱為靜態成員變數,簡稱靜態變數。靜態變數是屬於類,但是不依賴類特定的例項。靜態變數...
修飾符之static
靜態屬性可以用類名直接訪問,在類載入時就會被初始化到方法區。成員變數在建立物件時初始化 1.靜態方法可以用類名直接呼叫。2.靜態方法中只能訪問類的靜態成員 包括屬性和方法 3.靜態方法中不可以出現this this是指當前物件,而靜態方法裡時沒有當前物件的 注意 1.引用調靜態方法,實際是對引用型別...
Java中的靜態修飾符 static
靜態修飾符的特點 static是乙個修飾符,用於修飾成員 成員變數和成員函式 靜態成員隨著類的載入而載入。靜態成員優先於物件存在。靜態成員被所有物件所共享 靜態成員多了乙個中呼叫方式,可以被類名直接呼叫。靜態使用的注意事項。靜態方法只能訪問靜態成員,非靜態方法既可以訪問靜態又可以訪問非靜態。靜態方法...