儲存類定義 c++ 程式中變數/函式的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的型別之前。下面列出 c++ 程式中可用的儲存類:
從 c++ 17 開始,auto 關鍵字不再是 c++ 儲存類說明符,且 register 關鍵字被棄用。
如果你也想要學習程式設計,接受全面系統的指導。這裡有乙個學習基地推薦給你。不論是小白還是高階者,在這裡都能獲得成長。**即可聯絡管理員領取新手學習資料報,點我進入學習基地
自 c++ 11 以來,auto關鍵字用於兩種情況:宣告變數時根據初始化表示式自動推斷該變數的型別、宣告函式時函式返回值的佔位符。
c++98標準中auto關鍵字用於自動變數的宣告,但由於使用極少且多餘,在c++11中已刪除這一用法。
根據初始化表示式自動推斷被宣告的變數的型別,如:
auto f=3.14; //double
auto s("hello"); //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//錯誤,必須是初始化為同一型別
register儲存類用於定義儲存在暫存器中而不是 ram 中的區域性變數。這意味著變數的最大尺寸等於暫存器的大小(通常是乙個詞),且不能對它應用一元的 '&' 運算子(因為它沒有記憶體位置)。
暫存器只用於需要快速訪問的變數,比如計數器。還應注意的是,定義 'register' 並不意味著變數將被儲存在暫存器中,它意味著變數可能儲存在暫存器中,這取決於硬體和實現的限制。
static儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷毀。因此,使用 static 修飾區域性變數可以在函式呼叫之間保持區域性變數的值。
static 修飾符也可以應用於全域性變數。當 static 修飾全域性變數時,會使變數的作用域限制在宣告它的檔案內。
在 c++ 中,當 static 用在類資料成員上時,會導致僅有乙個該成員的副本被類的所有物件共享。
#include // 函式宣告
void func(void);
static int count = 10; /* 全域性變數 */
int main()
return 0;
}// 函式定義
void func( void )
當上面的**被編譯和執行時,它會產生下列結果:
變數 i 為 6 , 變數 count 為 9
變數 i 為 7 , 變數 count 為 8
變數 i 為 8 , 變數 count 為 7
變數 i 為 9 , 變數 count 為 6
變數 i 為 10 , 變數 count 為 5
變數 i 為 11 , 變數 count 為 4
變數 i 為 12 , 變數 count 為 3
變數 i 為 13 , 變數 count 為 2
變數 i 為 14 , 變數 count 為 1
變數 i 為 15 , 變數 count 為 0
extern儲存類用於提供乙個全域性變數的引用,全域性變數對所有的程式檔案都是可見的。當您使用 'extern' 時,對於無法初始化的變數,會把變數名指向乙個之前定義過的儲存位置。
當您有多個檔案且定義了乙個可以在其他檔案中使用的全域性變數或函式時,可以在其他檔案中使用 extern 來得到已定義的變數或函式的引用。可以這麼理解,extern 是用來在另乙個檔案中宣告乙個全域性變數或函式。
extern 修飾符通常用於當有兩個或多個檔案共享相同的全域性變數或函式的時候,如下所示:
第乙個檔案:main.cpp
#include int count ;
extern void write_extern();
int main()
第二個檔案:support.cpp
#include extern int count;
void write_extern(void)
在這裡,第二個檔案中的 extern 關鍵字用於宣告已經在第乙個檔案 main.cpp 中定義的 count。現在 ,編譯這兩個檔案,如下所示:
$ g++ main.cpp support.cpp -o write
這會產生write可執行程式,嘗試執行write,它會產生下列結果:
$ ./write
count is 5
mutable說明符僅適用於類的物件,這將在本教程的最後進行講解。它允許物件的成員替代常量。也就是說,mutable 成員可以通過 const 成員函式修改。
使用 thread_local 說明符宣告的變數僅可在它在其上建立的執行緒上訪問。變數在建立執行緒時建立,並在銷毀執行緒時銷毀。每個執行緒都有其自己的變數副本。
thread_local 說明符可以與 static 或 extern 合併。
可以將 thread_local 僅應用於資料宣告和定義,thread_local 不能用於函式宣告或定義。
以下演示了可以被宣告為 thread_local 的變數:
thread_local int x; // 命名空間下的全域性變數
class x
;static thread_local std::string x::s; // x::s 是需要定義的
void foo()
{ thread_local std::vectorv; // 本地變數
C 基礎知識篇
1.命名空間 在c 中,識別符號 name 可以是符號常量 變數 巨集 函式 結構 列舉 類和物件等。為了避免在大規模程式設計中以及在程式設計師使用各種各樣的c 庫時,這些識別符號的命名發生衝突,標準c 引入了關鍵字namespace 命名空間 以便更好控制識別符號作用域。定義格式如下 namesp...
c 基礎知識篇 初識c
我已經進行了小半年的c 程式設計工作了,先將之前看的參考書的知識進行簡單梳理來增強對c 的理解。梳理將按照參考書的順序,以小知識點的形式進行,c 初學跟著學習會事半功倍。1 c 程式必須且只能包含乙個main函式,main函式的返回值用來指示程式執行的狀態。2 c 原始檔的字尾型別 cc cpp c...
C 基礎知識篇 C 數字
通常,當我們需要用到數字時,我們會使用原始的資料型別,如 int short long float 和 double 等等。這些用於數字的資料型別,其可能的值和數值範圍,我們已經在 c 資料型別一章中討論過。我們已經在之前章節的各種例項中定義過數字。下面是乙個 c 中定義各種型別數字的綜合例項 in...