1. static和auto的相似之處
// 只不過這裡auto預設省略不寫
auto int a=10;
auto string str="this is a string";
static int a=10;
static string str="this is a string";
區別是:
- auto是由程式自動控制變數的生命週期;
- static變數的生命週期不是自動控制,而是跟隨程式本身。在初始化程式時分配,程式退出時釋放。
如下:
- 每次呼叫func時都會重新分配a變數,多個執行緒呼叫時a變數互相獨立;但是b變數在程式初始化時就分配了,不管有沒有呼叫func都會分配,多執行緒呼叫func時共用同一個b變數。
void func(){
int a;
static int b;
}
2. static在類中的用法:修飾成員變數和成員函式
class Girl{
private:
static string name; // static是宣告性的關鍵字
static void SayHi();
};
string Girl::name="Chow"; // 類外全域性初始化
void Girl::SayHi(){cout<<"Hi~"<<endl;}
注意點:
可以理解string Girl::name="Chow"為全域性變數,只不過帶有類安全屬性的;static成員函式,可以理解為,增加了類的訪問許可權的全域性函式;因此,訪問類的static成員不用建立例項物件。
-
static成員,在類中宣告,.cpp中全域性初始化。且必須要初始化。因為程式一開始就會給它分配記憶體,必須初始化。
-
static成員,該類的所有例項物件共用。是在該類的範疇內是個全域性變數。
-
static成員不屬於物件,訪問類的static成員不用建立例項物件,Girl::name和Girl::func()就可以直接訪問。
-
static成員函式,只能訪問類的static變數。static成員函式中也沒有this指標
-
static成員函式,不可設為虛擬函式,因為虛擬函式是執行時繫結,static是程式一開始就分配初始化了,不能參與多型和動態繫結。static成員與類相關,與物件例項不相關,沒有this指標無法訪問非靜態成員。
3. static在.cpp全域性區域的用法:只在.cpp內有效的全域性變數和全域性函式
// 在全域性區域宣告變數和函式
static int a=10; // static作用是,指定a只在本.cpp檔案內有效。不共享。不同cpp內的同名變數a,互相獨立
int a=0; // 錯誤寫法,用意不明,只在本.cpp用?還是共享?
/*
* 如何在不同.cpp中共享變數?
*
* 在.h標頭檔案中用extern關鍵字宣告,extern int a;
* 然後再任意一個對應的.cpp中初始化一次就可以了。
*/
static void SayHi(){cout<<"Hi"<<endl;} // static作用是,指定該函式只在本.cpp檔案內有效。不共享。不同cpp內的同名函式,互相獨立
void SayHi(){cout<<"Hi"<<endl;} // 錯誤寫法,用意不明
/*
* 如何讓多個.cpp複用一個函式?
* 多個.cpp中複用該函式,就把它的宣告提到標頭檔案裡去
*/