1_static關鍵字的使用

itsinsane發表於2024-10-30

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中複用該函式,就把它的宣告提到標頭檔案裡去
 */

相關文章