1. 程式人生 > 其它 >P21 - Static in C++(類外)(22.3.24)

P21 - Static in C++(類外)(22.3.24)

P21 - Static in C++(類外)(22.3.24)

static根據上下文會有兩種含義,他們的區別如下

  • **在類class或者是在結構體struct 外 **使用static
    • 類外的static修飾的符號在link階段是區域性的
  • **在類class或者是在結構體struct 內 **使用static
    • 若在類內或結構體內使用,則代表這個部分記憶體是這個類的所有例項共享的,簡單來說,就算你例項化了很多次這個類或者結構體,但那個靜態(static)變數只會有一個例項(有點全域性變數的味道在裡面了)

這裡著重講類外用static

在類外使用static的含義是它表示這個變數or函式在link的時候只在這個編譯單元(.obj)裡可見!

static變數或函式表示在link到它實際的定義時,linker不會在這個編譯單元(.obj)外面找它的定義(這有點像class裡面宣告私有成員,其他的編譯單元不能訪問static修飾的變數)

一個我不懂的點:字首extern是用來強制宣告一個變數or函式的,extern A表明A在其他編譯單元(or其他地方)有過定義了,讓編譯器別慌,直接用就對了,屬於是強制宣告

總結一點來說:在類外用static,這意味著,你定義的函式和變數只對它宣告所在的cpp檔案(編譯單元)是“可見"的

具體的應用是:可以在標頭檔案裡寫變數和函式,然後用static做字首,這樣子在兩個cpp檔案裡同時包含該標頭檔案時就不會出錯

,畢竟#include的原理就是複製貼上。更具體的應用場景可以參考在類中用私有成員時的場景,基本上static用的越多越好,如果不想讓變數全域性可見的話(畢竟全域性可見其實是相當痛苦的事情,很容易一個cpp影響一堆cpp,導致各種奇怪的bug,所以並不贊同使用全域性變數)

故使用重點是:儘量讓全域性函式和變數使用static標記,除非它們必須要用在其他編譯單元裡(兩個編譯單元做聯動)