c++ static有兩種用法:面向過程程式設計中的static和物件導向程式設計中的static。前者主要用於普通變數和函式。後者主要用於static在類中的作用。
1.1 靜態全域性變數
在全域性變數前加上關鍵字static ,該變數就會被定義成乙個靜態全域性變數
如下:
satic int n;
//定義靜態全域性變數
void
function()
intmain()
那為什麼我們不把static去掉,直接定義成int n呢?其實這也沒錯,程式會照樣執行,但是定義成靜態全域性變數,還有以下好處:
就像是以下**所示:
//檔案1
#include
#include
using
namespace std;
static
int n;
//定義靜態全域性變數
voidfn(
);intmain()
//檔案2
#include
#include
using
namespace std;
extern
int n;
//定義相同名字的變數n
voidfn(
)
此時我們發現,雖然單個檔案時編譯通過了,但是執行會報錯,這就是我們之前所提到的:我們可以在另外乙個檔案定義與靜態全域性變數相同的變數名稱,但是靜態全域性變數不能被這個檔案使用。
靜態全域性變數的特點:
1.2 靜態區域性變數
如下**:
voidfn(
)
在函式體內定義了乙個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。
那這裡static的作用更加明顯,第一次執行上述的fn函式,會輸出n=10;當第二次執行fn的時候n=11,因為static可以對兩次呼叫之間對變數的值進行儲存。那這裡我們就明白了為什麼不能用int n=10了,因為這樣定義,即使呼叫無數次fn,n的值還是10,不會變化。那為什麼不直接定義成全域性變數,把int n=10直接寫到函式外面?因為如果這樣定義的話,那這裡這個變數就不再屬於函式本身了,不受函式的限制,給程式維護帶來不便。
靜態區域性變數有以下特點:
1.3 靜態函式
在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。如下所示:
#include
using
namespace std;
static
voidfn(
);//宣告靜態函式
voidfn(
)//定義靜態函式
intmain
(void
)
定義靜態函式的好處:
2.1、靜態資料成員
在類內資料成員的宣告前加上關鍵字static,該資料成員就是類內的靜態資料成員。先舉乙個靜態資料成員的例子,如下:
#include
using
namespace std;
class
myclass
;int myclass::sum =0;
//定義並初始化靜態資料成員
我說的簡單點吧:
2.2 靜態成員函式
靜態成員函式和靜態資料成員一樣,它們都屬於類的靜態成員,它們都不是物件成員。因此,對靜態成員的引用不需要用物件名。
靜態成員函式的定義如下:
#include
using
namespace std;
class
myclass
;int myclass::sum =0;
//定義並初始化靜態資料成員
myclass::
myclass
(int a ,
int b ,
int c)
void myclass::
getsum()
//靜態成員函式的實現
與普通函式相比,靜態成員函式由於不是與任何的物件相聯絡,因此它不具有this指標。從這個意義上講,它無法訪問屬於類物件的非靜態資料成員,也無法訪問非靜態成員函式,它只能呼叫其餘的靜態成員函式
總結靜態成員函式(重點):
C C 中static關鍵字的作用
在c語言中static的作用如下 第一 在修飾變數的時候,static修飾的靜態區域性變數只執行一次,而且 延長了區域性變數的生命週期,直到程式執行結束以後才釋放。第二 static修飾全域性變數的時候,這個 全域性變數只能在本檔案中訪問 不能在其它檔案中訪問,即便是extern外部宣告也不可以 第...
C C 中static關鍵字的作用
在c語言中static的作用如下 第 一 在修飾變數的時候,static修飾的靜態區域性變數只執行一次,而且延長了區域性變數的生命週期,直到程式執行結束以後才釋放。第二 static修飾全域性變數的時候,這個全域性變數只能在本檔案中訪問,不能在其它檔案中訪問,即便是extern外部宣告也不可以。第三...
C C 中static關鍵字的作用
一 在c語言中static的作用如下 1 static修飾變數時,修飾的靜態區域性變數只執行一次,延長區域性變數的生命週期,在程式執行結束後才會釋放。2 static修飾全域性變數時,全域性變數只能在本檔案中訪問,不能在其它檔案中訪問,即便是extern外部宣告也不可以。3 static修飾函式時,...