c++基礎知識(八)C/C++中修飾符const、extern、static、volatile的用法

firedragonpzy發表於2012-07-13
1.const的用法:

為什麼使用const?

採用符號常量寫出的程式碼更容易維護;

指標常常是邊讀邊移動,而不是邊寫邊移動;

許多函式引數是隻讀不寫的。

const最常見用途是作為陣列的界和switch分情況標號(也可以用列舉符代替)

用法1:常量

取代了C中的巨集定義,宣告時必須進行初始化。const限制了常量的使用方式,並沒有描述常量應該如何分配。如果編譯器知道了某const的所有使用,它甚至可以不為該const分配空間。最簡單的常見情況就是常量的值在編譯時已知,而且不需要分配儲存。―《C++ Program Language》

用const宣告的變數雖然增加了分配空間,但是可以保證型別安全。

C標準中,const定義的常量是全域性的,C++中視宣告位置而定。

用法2:指標和常量

使用指標時涉及到兩個物件:該指標本身和被它所指的物件。將一個指標的宣告用const“預先固定”將使那個物件而不是使這個指標成為常量。要將指標本身而不是被指物件宣告為常量,必須使用宣告運算子*const。

所以出現在 * 之前的const是作為基礎型別的一部分:

char *const cp; // 到char的const指標
char const *pc1; // 到const char的指標
const char *pc2; // 到const char的指標(後兩個宣告是等同的)

從右向左讀的記憶方式:

cp is a const pointer to char.
pc2 is a pointer to const char.

用法3:const修飾函式傳入引數

將函式傳入引數宣告為const,以指明使用這種引數僅僅是為了效率的原因,而不是想讓呼叫函式能夠修改物件的值。同理,將指標引數宣告為const,函式將不修改由這個引數所指的物件。

通常修飾指標引數和引用引數:

void Fun( const A *in); // 修飾指標型傳入引數
void Fun(const A &in); // 修飾引用型傳入引數

用法4:修飾函式返回值

可以阻止使用者修改返回值。返回值也要相應的付給一個常量或常指標。

用法5:const修飾成員函式

const物件只能訪問const成員函式,而非const物件可以訪問任意的成員函式,包括const成員函式;

const物件的成員是不能修改的,而通過指標維護的物件卻是可以修改的;

const成員函式不可以修改物件的資料,不管物件是否具有const性質。編譯時以是否修改成員資料為依據進行檢查。


2.static的用法:

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

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

用法1:函式內部宣告的static變數,可作為物件間的一種通訊機制

如果一區域性變數被宣告為static,那麼將只有唯一的一個靜態分配的物件,它被用於在該函式的所有呼叫中表示這個變數。這個物件將只在執行執行緒第一次到達它的定義時初始化。

用法2:區域性靜態物件

對於區域性靜態物件,建構函式是在控制執行緒第一次通過該物件的定義時呼叫。在程式結束時,區域性靜態物件的解構函式將按照他們被構造的相反順序逐一呼叫,沒有規定確切時間。

用法3:靜態成員和靜態成員函式

如果一個變數是類的一部分,但卻不是該類的各個物件的一部分,它就被成為是一個static靜態成員。一個static成員只有唯一的一份副本,而不像常規的非static成員那樣在每個物件裡各有一份副本。同理,一個需要訪問類成員,而不需要針對特定物件去呼叫的函式,也被稱為一個static成員函式。

類的靜態成員函式只能訪問類的靜態成員(變數或函式)。

3.extern的用法

extern可以宣告其他檔案內定義的變數。在一個程式裡,一個物件只能定義一次,它可以有多個宣告,但型別必須完全一樣。如果定義在全域性作用域或者名字空間作用域裡某一個變數沒有初始化,它會被按照預設方式初始化。

將變數或函式宣告成外部連結,即該變數或函式名在其它函式中可見。被其修飾的變數(外部變數)是靜態分配空間的,即程式開始時分配,結束時釋放。

在C++中,還可以指定使用另一語言連結,需要與特定的轉換符一起使用。

extern “C” 宣告語句
extern “C” { 宣告語句塊 }

extern 表明該變數在別的地方已經定義過了,在這裡要使用那個變數。

static 表示靜態的變數,分配記憶體的時候,儲存在靜態區,不儲存在棧上面。static 作用範圍是內部連線的關係,和extern有點相反,它和物件本身是分開儲存的,extern也是分開儲存的,但是extern可以被其他的物件用extern 引用,而static 不可以,只允許物件本身用它。

4.volatile的用法

型別修正符(type-modifier),限定一個物件可被外部程式(作業系統、硬體或併發程式等)改變。volatile與變數連用,可以讓變數被不同的執行緒訪問和修改。

宣告時語法:

int volatile vInt;

常用於像中斷處理程式之類的非同步程式進行記憶體單元訪問。

除了基本型別外,對使用者定義型別也可以用volatile型別進行修飾。

注意:可以把一個非volatile int賦給volatile int,但是不能把非volatile物件賦給一個volatile物件。

一個有volatile識別符號的類只能訪問它介面的子集,一個由類的實現者控制的子集。使用者只能用const_cast來獲得對型別介面的完全訪問。此外,volatile向const一樣會從類傳遞到它的成員。


摘自:[url]http://hi.baidu.com/shirdrn/blog/item/47dcbf6d84847cfd431694dd.html[/url]

相關文章