C中static的作用大致三種:
首先static的最主要功能是隱藏,其次因為static變數存放在靜態儲存區,所以它具備持久性和預設值0。
分開來說:
(1)隱藏。這點主要針對靜態全域變數和靜態函數。對於非靜態全域變數的範圍是整個來源程式(可能包含多個檔案),而靜態全域變數則將其範圍限定在本檔案內。同理,靜態函數也將其範圍限定在本檔案內。利用static實現了變數名和函數名的隱藏,從而其他檔案內可以有同名函數或變數而不互相影響。static函數在記憶體中只有一份,普通函數在每個被調用中維持一份拷貝。
(2)持久性。主要針對靜態局部變數,把局部變數改變為靜態變數後,儲存到靜態儲存區,即改變了它的生存期,範圍不變。static局部變數只被初始化一次。
(3)預設初始化為0。因為全域變數本來預設初始化為0,所以主要針對靜態局部變數。
C++中static作用:
除了在面向過程設計中相容C中特性外,C++中增加的含義體現在物件導向程式設計時,此時static表示屬於一個類而不是屬於此類的任何特定對象的變數和函數(與Java中此關鍵字的含義相同)。具體的情況為:
(1)類的靜態成員變數
在cpp中必須對它進行初始化,如
int Myclass::sum = 0; //初始化待用資料成員,注意該處沒有static
如果變數被聲明為static,對象將只在執行線程第一次到達它的定義並初始化。
//oop.h#include<iostream>using namespace std;class Myclass{private:int a , b , c;static int sum; //聲明待用資料成員public:Myclass(int a , int b , int c);void GetSum();};//oop.cpp#include "oop.h"int Myclass::sum = 0; //定義並初始化待用資料成員Myclass::Myclass(int a , int b , int c){this->a = a;this->b = b;this->c = c;sum += a+b+c;}void Myclass::GetSum(){cout<<"sum="<<sum<<endl;}int main(void){Myclass M(1 , 2 , 3);M.GetSum();Myclass N(4 , 5 , 6);N.GetSum();M.GetSum();getchar();return 0;}
輸出為:6 21 21
(2)類的靜態函數
實現的時候也不需要static的修飾;類的靜態函數是在該類的範疇內的全域函數,只能訪問類的靜態成員(變數和函數),不需要類的執行個體即可調用;實際上,它就是增加了類的存取權限的全域函數。