存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量。
0x01 (普通)全局變量與靜態全局變量 (隱藏)
未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問,全局變量名或者函數名前加static,就會對其它源文件隱藏。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。
static全局變量只初始化一次,防止在其他文件中被引用。
0x02 (普通)局部變量與靜態局部變量
局部變量改為靜態變量后是改變了它的存儲方式(唯一的一次初始化),即改變了它的生存周期。
作為static局部變量在函數內定義,它的生存期為整個源程序,但是其作用域仍與自動變量相同,只能在定義該變量的函數內使用該變量。退出該函數后, 盡管該變量還繼續存在,但不能使用它。
// StaticDemo.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include <stdio.h>
int Function();
int main(void)
{
for (int i = 0; i <= 10; ++i)
printf("%d\n",Function());
return 0;
}
int Function() {
static int StaticNumberUnitOnlyOnce = 666; // 存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。
return StaticNumberUnitOnlyOnce--; //在static出現前,要達到同樣的功能,則只能使用全局變量:
}
0x03 (普通)函數和靜態函數
未加static前綴的全局變量和函數都具有全局可見性,其它的源文件也能訪問,全局變量名或者函數名前加static,就會對其它源文件隱藏。利用這一特性可以在不同的文件中定義同名函數和同名變量,而不必擔心命名沖突。
0x04 C++中的類成員聲明static
靜態數據成員是類的成員,而不是對象的成員,這樣就出現以下作用:
(1)類的靜態成員函數是屬於整個類而非類的對象,所以它沒有this指針,這就導致 了它僅能訪問類的靜態數據和靜態成員函數。
(2)不能將靜態成員函數定義為虛函數。
