1. 程式人生 > >C++ 儲存類

C++ 儲存類

儲存類定義 C++ 程式中變數/函式的範圍(可見性)和生命週期,C++ 程式中可用的儲存類:

  • auto
  • register
  • static
  • extern
  • mutable
  • thread_local (C++11)

auto儲存類

auto 關鍵字用於兩種情況:宣告變數時根據初始化表示式自動推斷該變數的型別、宣告函式時函式返回值的佔位符。

根據初始化表示式自動推斷被宣告的變數的型別,如:

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;
}

注:也就是說不是所有的區域性變數都儲存在棧裡面,只有不普通的區域性變數儲存在棧裡

static 儲存類

static 儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷燬。因此,使用 static 修飾區域性變數可以在函式呼叫之間保持區域性變數的值。

static 修飾符也可以應用於全域性變數。當 static 修飾全域性變數時,會使變數的作用域限制在宣告它的檔案內。

在 C++ 中,當 static 用在類資料成員上時,會導致僅有一個該成員的副本被類的所有物件共享。

總結:

  • static+區域性變數:區域性變數在整個程式生命週期內都存在,但是隻對定義它的那個函式可見,儲存在靜態儲存區(資料段),定義它的函式被多次呼叫的時候該區域性變數值有第一次呼叫的時候初始化,後面的值一直保持計算後的值。如果沒有做初始化,則預設初始化為0
  • static+全域性變數:僅僅在該檔案中能使用該全域性變數

extern 儲存類

extern 儲存類用於提供一個全域性變數的引用,全域性變數對所有的程式檔案都是可見的。當您使用 'extern' 時,對於無法初始化的變數,會把變數名指向一個之前定義過的儲存位置。

mutable 儲存類

mutable 說明符僅適用於類的物件,它允許物件的成員替代常量。也就是說,mutable 成員可以通過 const 成員函式修改。

thread_local 儲存類

使用 thread_local 說明符宣告的變數僅可在它在其上建立的執行緒上訪問。 變數在建立執行緒時建立,並在銷燬執行緒時銷燬。 每個執行緒都有其自己的變數副本。

thread_local 說明符可以與 static 或 extern 合併。

可以將 thread_local 僅應用於資料宣告和定義,thread_local 不能用於函式宣告或定義。

 

#include <iostream>
int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

std 代表標準名稱空間,:: 則是作用域運算子,在這裡用於定位到 std 名稱空間。標頭檔案 <iostream> 在這個名稱空間內聲明瞭 istream 與 ostream 等 IO 類,同時在 std 內聲明瞭 istream cin; 與 ostream cout; 這兩個常用物件。using namespace std; 的作用是曝光整個 std 名稱空間,使其中的所有成員皆可直接使用。