不考慮類 static 的三個作用
當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。
例如,同一模塊中,一個a.c,一個main.c a.c中
char a = 'A';void msg(){}在main.c中可以直接訪問到,如果加上static, 那么將只能在本文件中訪問到,而無法被該模塊下的其他文件訪問到
* 包括未初始化的全局靜態變量 和 靜態局部變量。(存儲在BSS段,默認都是0x00)
* 未初始化的全局變量 也是 默認初始化為 0
string sa[10]; // string 默認構造函數,為空串“”static int ia[10]; // 全局的,不論有無static 都初始化為0int main(){ string sa2[10]; // 局部,不過有默認的構造函數為空串“” int ia2[10]; // 局部,初始值是不確定的 return 0;}staticb變量值初始化一次,聲明周期為整個源程序
在函數中的static變量,不像棧中存儲的局部變量會消失
int fun(int n){ static int sums = n; // 每次調用都想通過賦值初始化,其實只初始化了第一次而已 sums += n; return sums;}int main(){ for(int i=0;i < 5;i++) { 類中 static的作用不屬于對象,屬于類,所有實例對象公用一份,
仍然有private,public,protect屬性
沒有對象實例,static成員依然存在類中
static 數據成員必須在類外初始化 當然,如果在加上關鍵const, 則是可以在類中進行初始化的
class A{public: static int a = 100; // 報錯};
與靜態數據成員一樣,仍然屬于類
this指針是非靜態成員函數有的, static成員函數將沒有this指針
靜態成員函數 無法訪問屬于類對象的非靜態數據成員,也無法訪問非靜態成員函數,只能調用其他的靜態成員函數,訪問靜態的數據成員
static成員函數不能聲明為const
const 修飾成員函數表示 該成員函數不會修改某個該函數所屬的對象,static不屬于任何對象

靜態成員之間的訪問
包括靜態成員函數訪問 靜態成員函數,靜態數據成員。靜態成員不能訪問非靜態的成員函數,不能訪問非靜態的成員數據,
非靜態的成員函數可以任意的訪問靜態成員函數 和 靜態數據成員
由于沒有this指針的額外開銷,靜態成員函數與類的非靜態成員函數相比速度上會有少許的增長。
新聞熱點
疑難解答
圖片精選