存盤類定義 C++ 程式中變數/函式的范圍(可見性)和生命周期,這些說明符放置在它們所修飾的型別之前,下面列出 C++ 程式中可用的存盤類:
- auto
- register
- static
- extern
- mutable
- thread_local (C++11)
從 C++ 17 開始,auto 關鍵字不再是 C++ 存盤類說明符,且 register 關鍵字被棄用,
如果你也想要學習編程,接受全面系統的指導,這里有一個學習基地推薦給你,不論是小白還是進階者,在這里都能獲得成長,進群即可聯系管理員領取新手學習資料包,點我進入學習基地
auto 存盤類
自 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 存盤類
register 存盤類用于定義存盤在暫存器中而不是 RAM 中的區域變數,這意味著變數的最大尺寸等于暫存器的大小(通常是一個詞),且不能對它應用一元的 '&' 運算子(因為它沒有記憶體位置),
{
register int miles;
}
暫存器只用于需要快速訪問的變數,比如計數器,還應注意的是,定義 'register' 并不意味著變數將被存盤在暫存器中,它意味著變數可能存盤在暫存器中,這取決于硬體和實作的限制,
static 存盤類
static 存盤類指示編譯器在程式的生命周期內保持區域變數的存在,而不需要在每次它進入和離開作用域時進行創建和銷毀,因此,使用 static 修飾區域變數可以在函式呼叫之間保持區域變數的值,
static 修飾符也可以應用于全域變數,當 static 修飾全域變數時,會使變數的作用域限制在宣告它的檔案內,
在 C++ 中,當 static 用在類資料成員上時,會導致僅有一個該成員的副本被類的所有物件共享,
實體
#include <iostream>
// 函式宣告
void func(void);
static int count = 10; /* 全域變數 */
int main()
{
while(count--)
{
func();
}
return 0;
}
// 函式定義
void func( void )
{
static int i = 5; // 區域靜態變數
i++;
std::cout << "變數 i 為 " << i ;
std::cout << " , 變數 count 為 " << count << std::endl;
}
當上面的代碼被編譯和執行時,它會產生下列結果:
變數 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 是用來在另一個檔案中宣告一個全域變數或函式,
extern 修飾符通常用于當有兩個或多個檔案共享相同的全域變數或函式的時候,如下所示:
第一個檔案:main.cpp
實體
#include <iostream>
int count ;
extern void write_extern();
int main()
{
count = 5;
write_extern();
}
第二個檔案:support.cpp
實體
#include <iostream>
extern int count;
void write_extern(void)
{
std::cout << "Count is " << count << std::endl;
}
在這里,第二個檔案中的 extern 關鍵字用于宣告已經在第一個檔案 main.cpp 中定義的 count,現在 ,編譯這兩個檔案,如下所示:
$ g++ main.cpp support.cpp -o write
這會產生 write 可執行程式,嘗試執行 write,它會產生下列結果:
$ ./write
Count is 5
mutable 存盤類
mutable 說明符僅適用于類的物件,這將在本教程的最后進行講解,它允許物件的成員替代常量,也就是說,mutable 成員可以通過 const 成員函式修改,
thread_local 存盤類
使用 thread_local 說明符宣告的變數僅可在它在其上創建的執行緒上訪問,變數在創建執行緒時創建,并在銷毀執行緒時銷毀,每個執行緒都有其自己的變數副本,
thread_local 說明符可以與 static 或 extern 合并,
可以將 thread_local 僅應用于資料宣告和定義,thread_local 不能用于函式宣告或定義,
以下演示了可以被宣告為 thread_local 的變數:
thread_local int x; // 命名空間下的全域變數
class X
{
static thread_local std::string s; // 類的static成員變數
};
static thread_local std::string X::s; // X::s 是需要定義的
void foo()
{
thread_local std::vector<int> v; // 本地變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/228327.html
標籤:C++
下一篇:十進制轉任意進制
