static關鍵字

static關鍵字的含義有哪些呢?如今總結以下:

1.static修飾變量
static能夠修飾變量。當static修飾全局變量時,表示該變量的做用域只存在於本文件。其餘文件就不能引用。好比:
在a.c文件裏定義了2個全局變量:
static int x = 10;
int y = 0;
其中x前面有static關鍵字修飾,而y沒有。那麼在文件b.c裏,若是想引用x,y,那麼:
extern int y;//正確
extern int x;//錯誤
也就是說,x是不能再b.c文件裏訪問的,但y是能夠的。這樣作,實際上是爲了防止模塊與模塊之間由於全局變量而形成的命名衝突

當static修飾函數內的局部變量時,表示該變量存儲在靜態存儲區,而不是存儲在棧上。所以該變量具備記憶功能。函數每次執行後,它的值都不會丟失。 

問題:下面的函數實如今一個數上加一個數,有什麼錯誤? 如何改正?
int add_n ( int n )
{
    static int i = 100;
    i += n;
    return i;
}
分析:因爲i聲明爲static的類型,它存儲在靜態存儲區,生命期爲整個程序執行期間。所以,它的值在每次函數調用以後,都不會丟失。該函數原意是想對n加上100。可是實際執行的是,對n加上的並非100而是函數上次執行後i的值。 所以,應該把代碼作以下改正:
int add_n ( int n )
{
    int i = 100;
    i += n;
    return i;
}
實際上,C庫中的strtok()函數就使用了static變量來計算。

如今來看一道Intel的面試題:
問題:A.c 和B.c兩個c文件中使用了兩個相同名字的static變量,編譯的時候會不會有問題?這兩個static變量會保存到哪裏(棧仍是堆或者其餘的)? html

答案:用關鍵字static的修飾的全局變量,代表這個變量僅在本文件(模塊)中有意義,不會影響其餘模塊。這兩個static變量保存在靜態存儲區。 

關於更多static修飾變量的介紹,您還能夠參考:《變量類型,做用域,存儲空間,生命週期 》

2.static修飾函數
static關鍵字還能夠修飾函數。在C語言裏,static修飾函數,與static修飾全局變量做用是同樣的,表示該函數僅在本文件中使用,其餘文件中的函數不能調用此函數。其餘文件中不能引用該函數,以免名字衝突。 

3.static在C++中
在C++裏,static修飾函數和變量,表示該函數或變量屬於該C++類的靜態成員,爲全部對象共同全部。在類中,靜態成員能夠實現多個對象之間的數據共享,而且使用靜態數據成員還不會破壞隱藏的原則,即保證了安全性。所以,靜態成員是類的全部對象中共享的成員,而不是某個對象的成員。 使用靜態數據成員能夠節省內存,由於它是全部對象所公有的,所以,對多個對象來講,靜態數據成員只存儲一處,供全部對象共用。

靜態數據成員的值對每一個對象都是同樣,但它的值是能夠更新的。只要對靜態數據成員的值更新一次,保證全部對象存取更新後的相同的值,這樣能夠提升時間效率。 

靜態成員函數不接受隱含的this自變量。因此,它就沒法訪問本身類的非靜態成員。面試

相關文章
相關標籤/搜索