C++關鍵字(static/register/atuo/extern/volatile/const)釋疑 (轉)

gugu99發表於2007-08-17
C++關鍵字(static/register/atuo/extern/volatile/const)釋疑 (轉)[@more@]

下面關於C++的幾個關鍵字是經常和我們打交道的而我們又經常對這些含糊不清的,本文根據自己的學習體會作以總結,以期達到真正理解和活用的目的。

static

l  靜態變數作用範圍在一個內,開始時分配空間,結束時釋放空間,預設初始化為0,使用時可改變其值。

l  靜態變數或靜態,即只有本檔案內的程式碼才可訪問它,它的名字(變數名或函式名)在其它檔案中不可見。

l  在函式體內生成的靜態變數它的值也只能維持

int max_so_far( int curr )//求至今(本次)為止最大值:namespace prefix = o ns = "urn:schemas--com::office" />

{

  static int biggest; //該變數保持著每次呼叫時的最新值,它的有效期等於整個程式的有效期

  if( curr > biggest )

  biggest = curr;

  return biggest;

}

l  在C++類的成員變數被宣告為static(稱為靜態成員變數),意味著它為該類的所有例項所共享,也就是說當某個類的例項修改了該靜態成員變數,其修改值為該類的其它所有例項所見;而類的靜態成員函式也只能訪問靜態成員(變數或函式)。

l  類的靜態成員變數必須在宣告它的檔案範圍內進行初始化才能使用,private型別的也不例外。如,


  float SavingsAccount::currentRate = 0.00154;


  (注:currentRate是類SavingsAccount的靜態成員變數)


register

l  用register宣告的變數稱著暫存器變數,在可能的情況下會直接存放在機器的暫存器中;但對32位不起作用,當global optimizations(全域性)開的時候,它會做出選擇是否放在自己的暫存器中;不過其它與register關鍵字有關的其它符號都對32位編譯器有效。

auto

l  它是型別識別符號,表明變數(自動)具有本地範圍,塊範圍的變數宣告(如for迴圈體內的變數宣告)預設為auto儲存型別。

extern

l  宣告變數或函式為外部連結,即該變數或函式名在其它檔案中可見。被其修飾的變數(外部變數)是靜態分配空間的,即程式開始時分配,結束時釋放。用其宣告的變數或函式應該在別的檔案或同一檔案的其它地方定義(實現)。在檔案內宣告一個變數或函式預設為可被外部使用。

l  在C++中,還可用來指定使用另一語言進行連結,這時需要與特定的轉換符一起使用。目前Microsoft C/C++僅支援”C”轉換標記,來支援C編譯器連結。使用這種情況有兩種形式:

extern “C” 宣告語句

extern “C” { 宣告語句塊 }

volatile

l  限定一個可被外部程式(操作、或併發執行緒等)改變,宣告時的語法如下:

int volatile nVint;

  這樣的宣告是不能達到最高效的,因為它們的值隨時會改變,系統在需要時會經常讀寫這個物件的值。  只常用於像中斷處理程式之類的非同步程式進行單元訪問。

const

l  const所修飾的物件或變數不能被改變,修飾函式時,該函式不能改變在該函式外面宣告的變數也不能呼叫任何非const函式。在函式的宣告與定義時都要加上const,放在函式引數列表的最後一個括號後。

l  在C++中,用const宣告一個變數,意味著該變數就是一個帶型別的常量,可以代替#define,且比#define多一個型別資訊,且它內連結,可放在標頭檔案中宣告;但在C中,其宣告則必須放在原始檔(即.C檔案)中,在C中const宣告一個變數,除了不能改變其值外,它仍是一具變數,如

const int maxarray = 255;

char store_char[maxarray];  //C++中合法,C中不合法

l  const修飾指標時要特別注意。例:

char *const aptr = mybuf;  // 常量指標


*aptr = 'a';  // Legal


aptr = yourbuf;  // Error


const char *bptr = mybuf;  // (指標bptr)指向常量資料


*bptr = 'a';  // Error


bptr = yourbuf;  // Legal


l  const修飾成員函式時不能用於構造和解構函式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963091/,如需轉載,請註明出處,否則將追究法律責任。

相關文章