C++中的static修飾符

一、static靜態總概述

首先說明,由static修飾的變量叫作靜態變量,由static修飾的函數叫作靜態函數。總的來說,靜態變量指的是在程序執行前,系統就爲之分配存儲空間的一類變量(在運行時不再分配內存)。

二、static使用場景---靜態變量

首先,介紹靜態存儲區的概念。靜態存儲區:內存在程序編譯時即已經分配好,這塊內存在程序的整個運行期間都存在。

因爲static變量是分配在靜態存儲區的,所以它的生存期爲整個源程序,不會隨着退出函數而消失。

從static修飾變量的位置可以分爲以下三種:

①在函數外的變量,即靜態全局變量,在全局變量前加static修飾符,那麼它和非靜態全局變量有什麼區別呢?

靜態全局變量VS非靜態全局變量區別:靜態全局變量限制了作用域,只能在定義該變量的源文件內有效;而非靜態全局變量作用域爲整個源程序,同一源程序下的多個源文件都有效。比如說,一個工程下有很多子編譯文件,普通全局變量是在所有子編譯文件中都可以使用,而靜態全局變量只能在當前編譯文件中使用。

 當然,無論是全局變量還是靜態變量,它們都分配在靜態存儲區。

②在函數內的局部變量,即靜態局部變量,它和普通的局部變量的區別是:普通局部變量是分配在棧上的,函數結束時它就會消失,假設一個函數調用了十次,那麼這個變量會重新定義十次。而靜態局部變量因爲分配在靜態存儲區,所以只會被定義初始化一次,當函數被再一次調用時,它的值保持上一次使用最後保存的值。

③在類中使用的靜態成員變量,類的靜態成員屬於整個類,從層次上就可以看出,它與普通成員變量的區別是,它不需要實例化就可以通過類名進行訪問,它不屬於某個對象,它可以被類的所有方法訪問。並且,靜態成員可以被任一對象修改,修改後的值被所有對象共享。

三、static使用場景---靜態函數

1.靜態函數如果用在類中,成爲靜態成員函數。只要在類中出現static,說明這個成員變量或者成員函數屬於整個類,而不屬於某個對象。我們說,靜態函數因爲在類實例化之前就已經加載到內存,而普通成員變量必須創建對象後才能使用,所以靜態方法只能訪問該類的靜態成員。

2.除了修飾類的成員函數,static還可以修飾普通的函數。此時,靜態函數只能在聲明它的文件中使用,在其他文件中是不可見的,也可以把它叫作內部函數。這樣的好處是,避免了多個文件下同名函數問題,因爲普通函數默認是extern,外部函數。此外,static函數在內存中只有一份,普通函數在每次調用時維持一份拷貝。

四、static使用場景---修飾類

在Java中,有一種特殊的用法,用static來修飾內部類,普通的類是無法用static修飾的。被static修飾的內部類可以當做一個普通類來使用,不需要實例一個外部類。

五、靜態、非靜態的區別

靜態與非靜態的區別主要體現在以下幾個方面:生存週期、內存分配、共享方式、調用方式、訪問方式

1.生存週期

靜態變量一直存在,直到程序的結束而銷燬,但是局部變量在函數調用結束即銷燬。

2.內存分配

靜態變量分配在靜態存儲區,而非靜態變量分配在棧、或者堆上。棧上存放的是由操作系統自動分配的變量,例如,局部變量,函數參數等;而堆上是由程序員主動分配釋放的空間,例如鏈表等,當然在Java中也可以通過垃圾回收機制不定期回收。

3.共享方式

靜態成員被類的所有對象共享,而非靜態成員不共享。

4.調用方式

靜態變量可以在實例化之前通過類名調用,而非靜態變量要在實例化之後通過實例化的對象調用。

5.訪問方式

靜態方法只能訪問靜態成員;而非靜態的方法可以訪問靜態成員,也可以訪問非靜態的成員。

六、靜態的作用

靜態的作用主要體現在兩個方面:作用域和存儲方式;

1.作用域,實現信息隱藏。使得全局變量和函數對其他文件不可見,同時避免了不同文件的命名衝突。

2.存儲方式,靜態存儲方式,每次調用時初始值爲上次調用的值,調用結束後存儲空間不釋放。可以保存局部變量內容的持久性。

同時提一句,靜態變量如果不給初始值,那麼系統會給它默認的初始值0,這點和全局變量類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章