Static 是什么 儲存的位置在哪里?
它是將變量or函數設置為靜態的一個標識符,儲存在全局數據區(數據并不會因為函數的退出而釋放空間)
Static 種類 ?
- 全局靜態變量
- 局部靜態變量
C++中還存在與之相關的兩個稱呼(這里先知道概念,后面介紹功能): - 靜態成員變量
- 靜態成員函數
Static 有什么用?
肯能會想到直接用全局變量就可以了,這里我們直接來比較有它和沒它的區別就可以了:
-
靜態全局和全局的區別:
靜態全局變量不能被其它文件所用(全局變量可以);
其它文件中可以定義相同名字的變量,不會發生沖突(自然了,因為static隔離了文件,其它文件使用相同的名字的變量,也跟它沒關系了) -
靜態局部變量和局部變量的區別:
(1)靜態局部變量在全局數據區分配內存(局部變量在棧區分配內存);
(2)靜態局部變量在程序執行到該對象的聲明處時被首次初始化,即以后的函數調用不再進行初始化(局部變量每次函數調用都會被初始化);
(3)它始終駐留在全局數據區,直到程序運行結束。但其作用域為局部作用域,也就是不能在函數體外面使用它(局部變量在棧區,在函數結束后立即釋放內存);
static類成員(C++中額外的用法)
-
在類中的主要作用
全局對象會破會破壞類的封裝,這時可以考慮定義一個獨立于特定對象純在的類的共享成員函數or數據成員,這樣每個數據成員or成員函數是和類關聯而不是對象.
class exampleStatic{
public: //private也可以 這個沒要求
static int test1; //這里省略在外初始化的內容
static int test2();
}
訪問方式:3種
exampleStatic init1;
exampleStatic *init2 = &init1;
int test;
test = init1.test1;//具體對象直接調用
test = exampleStatic::test2();//對象指針直接調用
test = init2->test2();//用類直接訪問
- 注意7點
1 static成員函數 沒有this指針 因為不屬于任何對象)
2 static成員函數不能被聲明為const(因為不是任何對象的組成部分)
3 static成員函數不能被聲明為虛函數(virtual 必須有this的概念,而它沒有)
4 static成員應該在定時初始化(不是通過構造函數初始化)
5 static成員可以作為默認實參(非static的不行)
6 static成員必須類定義體的外部定義
7 靜態成員函數不能訪問非靜態(包括成員函數和數據成員),但是非靜態可以訪問靜態(在類的對象產生之前就已經存在了,所以在非靜態成員函數中是可以調用靜態成員的 但是類卻不知道對象到底有什么成員)
注意:這篇文章大部分內容都是我之前通過網上的博客和C++ perimer中看到的,之前記錄在記事本上面,也記不得是哪些人的博客了,如果誰說這是他自己的文章的內容,那么他說的沒錯。我只是總結的搬運工