主要參考–> 這裏
寫下來是爲了記憶更加深刻,歡迎大家指正,希望和大家一起學習進步!
static 用法總結
- 討論static關鍵字時,主要從兩個方面進行:
1、作用域
2、生命週期
static 主要包括以下用法:
- 靜態局部變量
顧名思義,靜態局部變量是指定義在函數內部的變量,例如:
int function()
{
static int a = 1; // sign1
int b = 2; //sign2
int c = 3;
...(operations)
}
a. 作用域侷限於函數 function內部,不能在函數體外使用它,運行時間是整個程序運行期間(生命週期是直到程序結束);
b. 該變量在全局數據區(常量字符串,(未)初始化的全局變量和靜態變量)分佈內存,局部變量在棧區分配內存;
c. 當調用函數 function 時,靜態局部變量在第一次調用進入到 sign1 時被初始化,以後不管調用多少次都不需要再次初始化變量 a,而位於 sign2 的局部變量每次調用 function 都需要重新初始化;
- 靜態全局變量
作用域只能是在該文件內部,生存週期爲整個程序運行期間,例如現在有兩個 hpp:
**********************************************
//1.hpp
static int a = 1;
int b = 2;
...
**********************************************
//2.hpp
#include<iostream>
int a = 3; // extern int a; error!!!
extern static int b;
int main()
{
int c = a + b ;
std::cout << "sum of a and b: "<< c ;
system("pause");
}
// c = 5
***********************************************
由於 1.hpp 中變量 a 只能在該文件起作用,所以可以在 2.hpp 中重新定義,並且 2.hpp 也可以直接引用變量 b;但是 2.hpp 不能直接引用 a,因爲 a 的作用域限制。
Attention!:使用 #include<1.hpp>
就可以在 2.hpp 中直接使用變量 a 了.
- 靜態函數
作用同靜態全局變量,作用域:該文件內部,生命週期:整個程序運行期間,
別的文件不能直接調用,除非同上使用#include<1.hpp>
調用 1.hpp中的函數,所以它和靜態全局變量的好處是:
1、開發者不希望這個函數或者變量在其他文件中用到或者出現;
2、開發者依舊可以在其他文件中定義名稱相同的變量或者函數,避免衝突!
- 類中靜態數據成員以及靜態成員函數
靜態數據成員:生存期大於 class 的對象(實體 instance)。多個文件使用或者繼承某個類時,靜態數據成員(也叫類變量)是每個 class 獨一份日月更替,唯我獨尊!
,普通數據成員(實例變量)是每個 instance 調用時重新賦值花心鬼!
。
好處:
1、靜態數據成員節省內存,參考靜態局部變量,注意: 靜態數據成員存儲在全局數據區,定義時要分配空間,所以不能在類聲明中定義。
2、靜態成員函數的好處特點:
這裏 介紹的很好,我直接引用來:
1、當類的某些屬性需要所有對象都能夠統一公用一分內存的時候,就可以定於成靜態成員變量
2、靜態成員函數可以直接使用類去調用,所有當需要查看類的靜態成員變量屬性的時候可以直接通過靜態成員函數去調用,而不需要具體對象去調用
3、因爲static 成員屬於類,而不屬於具體的對象,所有static成員函數不能使用this指針
備註:如果有理解錯誤的地方,歡迎指正!