C 之static靜態修飾符詳解

2021-08-27 06:42:08 字數 1703 閱讀 8540

所以靜態成員資料也稱為類資料,靜態成員函式也稱為類方法。靜態成員資料在類裡只是乙個說明,還需要乙個定義(或叫初始化)。靜態成員資料要在類定義之外被初始化(要用類名限定修飾),而且程式裡只能提供一次,所以初始化不能放在標頭檔案裡。

例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是乙個修飾符,用於修飾成員 成員變數和成員函式 靜態成員隨著類的載入而載入。靜態成員優先於物件存在。靜態成員被所有物件所共享 靜態成員多了乙個中呼叫方式,可以被類名直接呼叫。靜態使用的注意事項。靜態方法只能訪問靜態成員,非靜態方法既可以訪問靜態又可以訪問非靜態。靜態方法...