靜態成員函式與靜態成員變數

2022-03-02 07:43:15 字數 2146 閱讀 9702

這篇介紹了靜態成員函式與靜態成員變數,是我的讀書筆記,我希望它夠簡短但又比較全面,起到複習的作用。如果有一些c++知識記不清楚了,它可以幫你很快回憶起來。

(1)加在區域性變數的前面使之成為靜態區域性變數,作用域還是在函式內部,可是生存週期延長了。

(2)加在全域性變數的前面限定該變數作用域為檔案作用域,就是說即使其他檔案使用了extern擴充套件作用域也不行。這在c語言的多人專案中非常有用,避免了變數的重名。然而在c++中這一功能已經被命名空間取代,但是為了保持和c語言的相容,static還是有這樣的功能。

(3)加在函式定義或宣告的前面,限定函式作用域到檔案作用域,也是為了避免多個檔案中有重名函式。

當static出現在類的定義中便出現了靜態成員變數和靜態成員函式。靜態成員是屬於類的,而不是屬於某個物件的。即便沒有任何乙個例項,類的靜態成員變數也已經存在了,而且還可能通過「類名::成員名」進行訪問。類的靜態成員函式也可以用相同的方式呼叫,在類產生例項之前就呼叫成員方法,典型應用是實現單例模式。

(1)靜態成員變數

靜態成員變數本質上是全域性變數,但是將和某些類關係緊密的全域性變數寫到類裡面,形式上成為乙個整體,更容易理解和維護。所以盡量使用靜態成員變數吧,減少全域性變數的使用。普通成員變數每個物件都有各自的乙份,但是靜態成員變數一共只有乙份,被所有的本類物件共享。如果使用sizeof運算子計算物件的大小,得到的結果是不包含靜態成員變數在內的。

靜態成員同樣受到private,public等的限制。

靜態成員變數的乙個典型應用就是用來計數生成的例項的個數。大體思路是設定乙個名為num的靜態成員變數並初始化為0,在建構函式中++num,析構函式中--num。這樣num的值就是當前例項的個數。實際上這也帶來了乙個隱蔽的bug。看下面的**:

1

class

cnum

5 cnum() 6};

78int cnum::num = 0;9

void

fun(cnum n)

1011

intmain()

結果:-1

num盡然成了乙個負數,難道析構函式比建構函式多呼叫了一次?實際上不是的。當執行 fun(n); 語句時呼叫了複製建構函式,這個函式因為我們沒有給出實現,所以是用的編譯器預設提供的版本,在這個建構函式中並沒有++num這條語句,因此少計數了兩次(兩次呼叫fun(n))。

解決的方法就是一定要提供自己寫的複製建構函式並在函式體中加入 ++num;

(2)靜態成員函式

靜態成員函式內部不能呼叫非靜態成員函式,原因是,非靜態成員函式需要傳入乙個this指標,這讓靜態成員函式很為難,它並不知道與之相關的資訊,也就無法提供this指標。

上面**中的第8行 int cnum::num = 0; 是靜態成員變數的初始化。這可以視為是靜態變數的定義(定義的同時初始化,即便不初始化也需要這個定義),而把類內的 static

int num; 視為乙個宣告,這樣的理解可以突出這樣乙個事實:靜態成員變數本質上是全域性變數。注意在類外定義時加上「類名::」。

對於常量成員變數,我們知道初始化時一定要使用初始化列表,那麼當乙個變數既是常量又是靜態成員時(同時被const和static修飾)要怎麼樣初始化呢?是像一般的靜態成員變數一樣在類外定義並初始化,還是像一般的常量成員變數一樣使用初始化列表呢?答案時前者,即在類外定義並初始化,在類內宣告,就像下面那樣:

1

class

cnum ;56

const

int cnum::num = 0;7

8int

main()

實際上,完全可以把const int 視為一種資料型別,它的地位和int一樣。這樣理解是有好處的,比如從const int到int需要強制型別轉換,把他們看成兩種型別,這就自然而然。相應的const char 和char 也應該看成兩種型別,就好像它們完全沒有什麼特殊的關係一樣。

另外static const int型別和static const char 型別可以在類內直接初始化,就是說都不需要在類外再次定義,像下面這樣:

1

class

cnum ;56

7int

main()

靜態成員函式與靜態成員變數

此文針對於初學者或者對這一部分掌握不太清楚的人。首先靜態成員函式的宣告 static void setname qstring name 需要在函式的宣告前加static關鍵字。定義的時候和普通成員函式一樣,不需要加static,但是靜態成員函式只能訪問靜態成員變數和靜態成源函式。class dem...

靜態成員函式 靜態成員變數

靜態的成員函式,同靜態資料成員類似,它也是屬於類,而不是屬於某乙個物件的。靜態成員函式不能訪問非靜態的資料成員,它只能訪問靜態資料成員,也只能呼叫其它的靜態成員函式。原因是 當前物件的位址 this 是被隱含地傳遞到被呼叫的函式的。但乙個靜態成員函式沒有 this 指標,所以它無法訪問非靜態的成員函...

C 靜態成員變數與靜態成員函式

類的靜態成員有兩種 靜態成員變數和靜態成員函式,語法是在普通成員變數和成員函式前加static關鍵字。0 定義class crect 1 存在原因 靜態成員變數在本質上是全域性變數。乙個類,哪怕乙個物件都不存在,其靜態成員變數也是存在的。靜態成員函式並不需要作用在某個具體的物件上,因此本質上是全域性...