C++ 儲存類別


儲存類別定義 C++ 程式中變數/函數的範圍(可見性)和生命週期。這些說明符放置在它們所修飾的類型之前。以下列出C++ 程式中可用的儲存類別:

  • auto

  • #register

  • ##static

  • extern

  • mutable

auto 儲存類別

auto 儲存類別是所有局部變數預設的儲存類別。

{
   int mount;
   auto int month;
}

上面的實例定義了兩個具有相同儲存類別的變量,auto 只能用在函數內,即 auto 只能修飾局部變數。

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 成員函數來修改。