這篇文章沒有太多的實際內容,簡單記錄下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寫東西果然爽,不過以前中文格式看習慣了,誰能告訴我,首行縮進兩個字這個需求該怎麼辦到。