C/C++中 const,extern,static,volatile的使用(轉帖)

來源:互聯網
上載者:User
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一樣會從類傳遞到它的成員。

 原文地址 http://afericazebra.blog.163.com/blog/static/30050408200801494053866/
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.