主要從兩個方面做回答,儲存域和作用域
1.第一條也是最重要的一條:隱藏.(static函式和static變數均可)
當同事編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。
舉個例子:
同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。
// a.c
char a = 'a';
void msg()
// main.c
int main()
程式執行的結果是:
a hello
為什麼在a.c中定義的區域性變數a和函式msg能在main.c中使用?前面說過,所有未加static字首的
全域性變數和函式都具有全域性可見性,其他的原始檔也能訪問。此例中,a是全域性變數,msg是函式,並且
都沒有加static字首,因此對於另外的原始檔main.c是可見的。
如果加了static,就會對其他原始檔隱藏。例如在 a和msg的定義前面加上static,main.c就看不到它們了,
利用這一特性可以再不同的檔案定義同名函式和同名變數,而不必擔心命名衝突。static可以用作函式和變數的
字首,對於函式來講,static的作用僅限於隱藏。
2.static的第二個作用是保持變數內容的持久。(static變數中的記憶功能和全域性生存期)
儲存在靜態資料區的變數會在程式剛開始執行時就完成初始化,也是唯一的一次初始化。共有兩種變數儲存
在靜態儲存區:全域性變數和static變數,只不過和全域性變數比起來,static可以控制變數的可見範圍。
ps:如果作為static區域性變數在函式內定義,它的生存期為整個源程式,但是其作用域仍與自動變數相同,只能
在定義該變數的函式內使用該變數。退出該函式後,儘管該變數還繼續存在,但是不能使用它。
#include int fun()
int count = 1;
int main(void)
基於以上兩點可以得出乙個結論:
把區域性變數改為靜態變數後是改變了它的儲存方式,即改變了它的生存週期。把全域性變數改變為靜態變數後是改變了它的作用域,
限制了它的使用範圍,。因此static這個說明符在不同的地方所起的作用是不同的。
3.static的第三個作用是預設初始化為0 (static變數)
4.static的第四個作用:c++中的類成員宣告static
在類中宣告static變數或函式時,初始化時使用作用域運算子來表明它所屬類,因此,靜態資料成員是類的成員。
而不是物件的成員,這樣就出現以下作用:
1)類的靜態成員函式時屬於整個類而不是類的物件,所以它沒有this指標,這就導致了它僅能訪問類的靜態成員資料和靜態成員函式
2)不能將靜態成員函式定義為虛函式
3)static並沒有增加程式的時空開銷,相反還縮短了子類對父類靜態成員的訪問時間,節省了子類的記憶體空間
4)靜態資料成員必須進行初始化。
this關鍵字 static關鍵字
1.當成員變數和區域性變數重名,可以用關鍵字this來區分 this 代表物件,代表那個物件呢?當前物件 this就是所在函式所屬物件的引用 簡單說 那個物件呼叫了this所在的函式,this就代表哪個物件 this也可以用於在建構函式中呼叫其他建構函式 注意 只能定義在建構函式的第一行,因為初始化...
static(靜態)關鍵字的特點和用法
靜態 static 用法 是乙個修飾符,用於修飾成員 成員變數,成員函式 class person 每例項化乙個person物件,每個物件在堆記憶體中都有乙個country 而加上static以後,就只在記憶體總存在乙個靜態的country被其他的物件直接呼叫,可以節省記憶體空間。當成員被靜態修飾以...
Java this關鍵字,static關鍵字
1,this.屬性,this.方法,表示當前物件的屬性,當前類的方法 2,this,表示當前物件,當前正在操作這個方法的物件就是當前物件 3,使用this 引數若干 可以呼叫當前類的構造方法,如果,構造方法之間相互呼叫,則有要求 一 this 必須放在首行,二 至少有乙個構造方法是沒有呼叫this ...