這篇文章沒有太多的實際內容,簡單記錄下static的用法。順便試一下用markdown來寫文章。
我們都知道在一個函數中的變量是存儲在棧區中,函數的每一次調用都伴隨著變量的重新定義和銷毀。如果在變量前面加上static關鍵字,這個變量就會在程序的靜態存儲區。這個變量只會在第一次調用函數的時候定義並初始化。當再次調用函數時,會保留上次的值。例子:
int showNum() { static int num = 0; return num++; } int main() { for(int i=0;i<10;i++) { cout << showNum() << endl; } return 0; }//打印0到9
這裡面規則有點多,我直接上代碼,然後比較好說明:
class X{ int i; static int j; public: X(int ii = 6) : i(ii){ //非靜態成員函數可以訪問靜態成員函數和變量 j = i; } int val(){return j;} static int incr(){ return ++j; } static int f() { return incr(); } }; int X::j = 0; int main() { X x; X* xp = &x; cout << x.f() << endl; cout << xp->f() << endl; cout << X::f() << endl; cout << sizeof(X) << endl; return 0; }
有下面幾個要點:
上面sizeof(X)的結果是4,說明靜態成員變量j是放在靜態存儲區域。每個對象的成員變量都是獨立的,而靜態成員是所有對象共享,它沒有this指針,所以靜態成員函數只能訪問靜態成員變量。
這個translation unit我也不知道該怎麼翻譯,就理解為一個源文件吧。static還有一個作用就是,聲明為static的變量和函數只在該文件(translation unit)有效,在其他文件中不能訪問。這在大型工程中,能有效避免命名重復。
markdown寫東西果然爽,不過以前中文格式看習慣了,誰能告訴我,首行縮進兩個字這個需求該怎麼辦到。