C++学习——static
文章目錄
- 1. static的用法和作用?
- 2.靜態變量什么時候初始化
1. static的用法和作用?
1.先來介紹它的第一條也是最重要的一條:隱藏。(static函數,static變量均可)
當同時編譯多個文件時,所有未加static前綴的全局變量和函數都具有全局可見性。用static修飾的變量的聲明式即為其定義式。如果沒有手動的初始化,系統會為該變量提供一個初始值。 但是static變量最好在使用的編譯單元里(.c/.cpp)聲明定義,如果定義在頭文件里,如果頭文件被重復引用講導致變量的重復定義。
2.static的第二個作用是保持變量內容的持久。(static變量中的記憶功能和全局生存期)
存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。
3.static的第三個作用是默認初始化為0(static變量)
其實全局變量也具備這一屬性,因為全局變量也存儲在靜態數據區。
在靜態數據區,內存中所有的字節默認值都是0x00,某些時候這一特點可以減少程序員的工作量。
static的作用
4.static的第四個作用:C++中的類成員聲明static
1) 函數體內static變量的作用范圍為該函數體,不同于auto變量, 該變量的內存只被分配一次,因此其值在下次調用時仍維持上次的值; #include<iostream> using namespace std;class solution { public:int a;void print() {static int s = 100;cout << s << endl;s++;} };int main() {solution D1;for (int i = 0; i < 5; i++) {D1.print();}return 0; } 100 101 102 103 104 2) static修飾的類的成員變量必須要在類外初始化, static修飾的類成員函數,既可以在類內定義,又可以在類外定義。 #include<iostream> using namespace std;class solution { private:static int s; public:static void print() {cout << "static print" << endl;}//類的靜態成員函數可以在類內進行定義 };int solution::s = 1200;//在類的靜態成員變量必須在類外進行初始化。int main() {solution D1;D1.print();return 0; } 3) 在模塊內的static全局變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問; #include<iostream> using namespace std;class solution { private:static int s; public:static void print() {cout << "static print" << s << endl;}void pprint() {cout << "pprint" << s << endl;}void ppprint(); };int solution::s = 1200;void solution::ppprint() {cout << "ppprint" << s << endl; } int main() {solution D1;D1.print();D1.pprint();D1.ppprint();return 0; } static print1200 pprint1200 ppprint1200 4) 在模塊內的static函數只可被這一模塊內的其它函數調用, 這個函數的使用范圍被限制在聲明它的模塊內; 5) 在類中的static成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝; 6) 在類中的static成員函數屬于整個類所擁有,這個函數不接收this指針, 因而只能訪問類的static成員變量。 7) 由于static修飾的類成員屬于類,不屬于對象,因此static類成員函數是沒有this指針的, this指針是指向本對象的指針。正因為沒有this指針,所以static類成員函數不能訪問非static的類成員, 只能訪問 static修飾的類成員;8) static成員函數不能被virtual修飾,static成員不屬于任何對象或實例, 所以加上virtual沒有任何實際意義; 靜態成員函數沒有this指針,虛函數的實現是為每一個對象分配一個vptr指針, 而vptr是通過this指針調用的,所以不能為virtual; 虛函數的調用關系,this->vptr->ctable->virtual function2.靜態變量什么時候初始化
初始化只有一次,但是可以多次賦值,在主程序之前,編譯器已經為其分配好了內存。
靜態局部變量和全局變量一樣,數據都存放在全局區域,所以在主程序之前,編譯器已經為其分配好了內存,但在C和C++中靜態局部變量的初始化節點又有點不太一樣。在C中,初始化發生在代碼執行之前,編譯階段分配好內存之后,就會進行初始化,所以我們看到在C語言中無法使用變量對靜態局部變量進行初始化,在程序運行結束,變量所處的全局內存會被全部回收。
而在C++中,初始化時在執行相關代碼時才會進行初始化,主要是由于C++引入對象后,要進行初始化必須執行相應構造函數和析構函數,在構造函數或析構函數中經常會需要進行某些程序中需要進行的特定操作,并非簡單地分配內存。所以C++標準定為全局或靜態對象是有首次用到時才會進行構造,并通過atexit()來管理。在程序結束,按照構造順序反方向進行逐個析構。所以在C++中是可以使用變量對靜態局部變量進行初始化的。
總結
以上是生活随笔為你收集整理的C++学习——static的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的常用操作——查看和修改文件权
- 下一篇: linux基础知识——环境变量