1、cpp文件中的全局靜態變量
全局內的聲明:
static int a=0;
這樣的靜態全局變量就只能被該cpp文件所用,不能被其他cpp文件共享。
若不聲明static:
int a=0;
這樣的全部變量既不能保證a能被其他cpp文件共享,又不能保證不能被其他cpp文件共享。不建議這樣使用,最好加extern:
extern int a=0;
2、靜態局部變量
int f()
{
static int a=1;
}
靜態局部變量保存在靜態變量區,而不是棧中,所以生存周期是整個程序的周期,而不是函數的周期。只申請一次內存,然後下次調用該函數時,還保存著上次a的值。
3、cpp文件中的全局靜態函數
在cpp內聲明:
static int func();
和cpp中的全局靜態變量一樣,該函數的作用域僅為該cpp文件,只能為本cpp所用。若要給多個cpp文件調用,則放在頭文件中,不要加static。
4、類的靜態成員
class A
{
private:
static int a;
}
靜態成員作用域為類A,變量a並不為某個實例所有,而是為整個類有所,是類A的共享成員變量。靜態成員a必須在cpp中初始化:
int A::a =0; //注意:這裡沒有static修飾,因為static是聲明性關鍵字
5、類中的靜態成員函數
class A
{
private:
static void func(int);
}
實現該函數時同樣無需關鍵字static,因為static是聲明性關鍵字;
類的靜態成員函數是該類范疇內的全局函數,不能訪問該類的私有成員,智能訪問該類的靜態成員,不需要實例即可調用,直接A::func(9);
靜態成員函數可以繼承和覆蓋,不能是虛函數。
static沒有this指針。
總結:其實static的原則是他在內存的靜態變量區,所以生存周期不一樣,其次他只申請一次,所以不會被覆蓋。