1、靜態變數和全域性變數都是在全域性區(靜態區)分配記憶體空間,在整個程式執行期間都不釋放,直到程式結束執行。
2、靜態變數和全域性變數只在編譯的時候完成一次賦初值。
有時候希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的記憶體單元不釋放,在 下一次該函式呼叫時,該變數保留上一次函式呼叫結束時的值。這時候我們應該指定該區域性變數為靜態區域性變數(static local varible),
有時在程式設計時,希望某些外部變數只限定在本檔案引用,而不被其他檔案引用,這時可以在定義外部變數時新增乙個static宣告
函式從本質來說是全域性的,因為乙個函式要被另外乙個函式呼叫。但是我們也可以指定函式只能被本檔案呼叫,而不能被其他呼叫其他檔案。因此,可以將函式區分為內部函式(靜態函式)和外部函式,內部函式是用關鍵字static宣告,外部函式以extern宣告,一般情況下,我們都是省略extern關鍵字。
在c++中引入了類的概念,我們也可以為類中的資料成員和成員函式新增static關鍵字,在類中用static關鍵字修飾的資料成員和成員函式,有了其他的含義,下面一一介紹。
靜態資料成員是一種特殊的資料成員,它以關鍵字static開頭。例如:
class cbox
cbox():m_nlength(0), m_nwidth(0){};
cbox(int nlengh, int nwidth):m_nlength(0), m_nwidth(0){};
public:
static int m_nnum;//靜態資料成員
private:
static int m_nheight;//m_nheight是私有的靜態資料成員
int m_nwidth;
int m_nlength;
};
//靜態資料成員的初始化,同時賦初值10和0.沒有這一句程式編譯錯誤
int cbox::m_nheight = 10;
int cbox::m_nnum = 0;
下面從多角度解析靜態資料成員。
1.多個物件之間的資料共享。
靜態資料成員不屬於某個物件,而是屬於這個類,靜態資料成員在記憶體中只占用乙份,所有的物件都可以引用和修改它。乙個物件修改了它,則其他物件的值也都跟隨發生變化。
2.記憶體分配。
靜態資料成員在所有物件之外單獨開闢空間,不占用類物件的空間。只要類中宣告了靜態資料成員,則該成員在程式編譯的時候就已經分配了記憶體空間。
3.生命週期
靜態資料成員不隨物件的建立和分配空間,也不隨物件的撤銷而釋放空間。它是在程式編譯時分配空間,程式執行結束才釋放。
4.初始化
靜態資料成員可以初始化,但只能在類體外進行初始化工作,沒有初始化程式編譯錯誤。若初始化時,沒有賦初值,編譯器自動賦值為0.
格式如下:
資料型別 類名::靜態資料成員 = 初值。
注意:不能用引數初始化列表進行靜態資料成員的初始化。例如:
cbox():m_nheight(0),m_nlength(0), m_nwidth(0){};//錯誤,m_nheight是靜態資料成員
int cbox::m_nheight = 0;//正確
5.靜態資料成員的引用
靜態資料成員可以通過物件名引用,也可以通過類名來引用,如果該靜態成員是私有的,則不能在類外訪問。
cbox box;
cout << cbox::m_nheight << endl;//private不能類外訪問
cout << cbox::m_nnum << endl; //public 正確
cout << box.m_nheight << endl; //private不能類外訪問
cout << box.m_nnum << endl; //public 正確
成員函式也可以定義為靜態的,就在函式宣告時加上關鍵字static。例如:
static void output();
下面也從多角度說明靜態成員函式。
1.記憶體分配
靜態成員函式是類的一部分,而不是物件的一部分。在類載入的時候,編譯器就已經為靜態成員函式分配空間。
2.靜態成員函式引用
假設該靜態成員函式是公用的,則可以在類外通過類名和域運算子「::」加以呼叫,也可以通過物件名呼叫該靜態成員函式。例如:
cbox box;
box.output1(); //物件名,本質是使用物件的型別(cbox)
cbox::output1();//類名和域作用符
3.靜態成員函式的作用
靜態成員函式的作用是為了能夠處理靜態成員資料,靜態成員函式一般只用來處理靜態成員資料,呼叫非靜態資料成員,將會出現錯誤。例如:
static void output1()
static void output3()
然而,非靜態成員函式卻可呼叫靜態資料成員。例如
void output2()
4.靜態成員函式和非靜態成員函式的區別
非靜態成員函式有this指標,可以進行預設呼叫的成員函式,而靜態成員函式卻沒有this指標,無法知道使用哪個物件的資料成員,因此不能進行預設呼叫。例如:
static void output3()
void output4()
現在對c/c++中的static關鍵字做基本總結:
c中static關鍵字
看別人的c 會看到很多變數或者函式前面帶有static關鍵字。c中的static和php中的static有很到的不同,在php中static表示靜態化變數,乙個類中的static成員只與類有關,而與類的例項無關。c中的static關鍵字主要用於隱藏 access control 1.隱藏 函式前的s...
C 中static關鍵字
c 的static有兩種用法 面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函式,不涉及類 後者主要說明static在類中的作用。一 面向過程設計中的static 1 靜態全域性變數 在全域性變數前,加上關鍵字static,該變數就被定義成為乙個靜態全域性變...
C 中static 關鍵字
c 包含了c的特性和c 的特性,static 自然也具備了這兩者的特性 靜態全域性變數 該變數在全域性資料區分配記憶體 未經初始化的靜態全域性變數會被程式自動初始化為0 自動變數的值是隨機的,除非它被顯式初始化 靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的 靜態區域性變數 在區...