C++中重要關鍵字總

前進的菜鳥發表於2012-09-19

const:

const 是一個左結合的型別修飾符,它與其左側的型別修飾符和為一個型別修飾符。const可以用於定義常量,可以限定函式的引用引數(因為傳值的引數根本不用限定),可以限定函式返回值為引用的情況。還有一個用法是修飾類的成員函式。這樣情況下,在類內的宣告和類外的定義都要加上const。

還有一種情況是,宣告類的const成員變數的時候,如何進行初始化。

在這種情況下,由於常量不能修改,所以只能在建構函式的初始化列表中進行復制初始化。如果同時宣告為了static時可以在類外進行初始化,但此時不能加static關鍵字。

mutable:

mutalbe的中文意思是"可變的,易變的",跟constant(既C++中的const)是反義詞。在C++中,mutable也是為了突破const的限制而設定的。被mutable修飾的變數(mutable只能由於修飾類的非靜態資料成員),將永遠處於可變的狀態,即使在一個const函式中。

我們知道,假如類的成員函式不會改變物件的狀態,那麼這個成員函式一般會宣告為const。但是,有些時候,我們需要在const的函式裡面修改一些跟類狀態無關的資料成員,那麼這個資料成員就應該被mutable來修飾。

explicit:

explicit使用注意事項:

*explicit 關鍵字只能用於類內部的建構函式宣告上。

*explicit 關鍵字作用於單個引數的建構函式。

* 在C++中,explicit關鍵字用來修飾類的建構函式,被修飾的建構函式的類,不能發生相應的隱式型別轉換,只能以顯示的方式進行型別轉換。

explicit關鍵字只能用於類內部的建構函式宣告上。在類的定義體外部所做的定義上不能再重複它。

如果一個類或結構存在多個建構函式時,explicit 修飾的那個建構函式就是預設的

當建構函式被宣告為explicit時,編譯器將不使用它作為轉換操作符。

explicit 關鍵字作用於單個引數的建構函式。

通常,除非有明顯的理由想要定義隱式轉換,否則,單形參建構函式應該為explicit。

friend:

(1) 類的friend函式可以訪問類的private和protected成員。

(2) friend關係不能繼承,基類的友元對子類的成員沒有特殊訪問許可權,如果基類被授予友元關係,則只有基類具有特殊訪問許可權,其派生類不能訪問授予友元關係的類。

(3) 派生類的friend函式可以訪問派生類的一切變數,包括從基類繼承下來的protected域中的變數,但對父類來說它不是friend。

(4) friend關鍵字只能出現在類定義內部,不可出現在外部。

inline:

(1) inline表示內聯,即在函式呼叫出將函式內聯地展開。

(2) inline既可以出現在類定義內部,也可以出現在外部。當在外部出現時必須定義在類定義的標頭檔案中,因為呼叫函式時需要看到函式是什麼樣子。

static:

(1) static類成員屬於整個類,不屬於某個類物件。

(2) static成員遵循正常的公有/私有訪問規則。

(3) 對於public static成員可以通過類名或物件名訪問,對於private static成員則不可,須按照正常private成員訪問規則進行訪問。

(4) static成員函式可以訪問static成員函式和變數,不可訪問非static成員和函式,因為static成員是類的,而非static是物件的,類的產生先於物件,怎麼能在物件為產生之間就呼叫它的資料呢。

(5) 非static成員函式既可以訪問static成員又可以訪問非static成員。

(6) 可以通過類名直接呼叫public static成員,或者通過物件名、引用或指標間接呼叫。注意此處指的是public static成員,不是private。

(7) static成員函式沒有this指標,因為this指向的是物件。

(8) static成員函式不能宣告為const或虛擬函式,因為此二者都是針對物件而言,此外static函式實際上是"加上了訪問控制的全域性函式",全域性函式當然沒有虛擬函式。但是static變數可以宣告為const。

(9) static只用於類內宣告,在類外定義時不能加static。

(10) static變數的初始化只能放在原始檔中,如果放在標頭檔案中可能會被重複定義。

(11) 在對static變數進行初始化時,可以忽略任何存取許可權的束縛,例如:

double ClassA::m_a = 0.05; (注意假設ClassA::m_a是private, 則除了在定義static時可以這樣寫外,其它地方均不得如此)

(12) static成員變數不能再類內初始化,必須在類外定義時初始化(在原始檔中),但是有個例外,const static成員可以在類內初始化,同時仍必須在類外進行定義,定義時無需加static,無需指定初始值,但必須加const修飾符。[這一條引自C++ Primer,4th Edition, P401,但是上機實驗證明,如果已經在類內初始化,則就不須在類外定義,否則產生多重定義的變異錯誤,不知道是不是編譯器的問題,我用的是VS2005]

(13) static成員可以被繼承,父類的static變數和函式在派生類中依然可用,但是受訪問控制,而且對static變數來說,派生類和父類中的static變數是共用空間的,這點在利用static變數進行引用計數時要注意。

靜態成員函式不能夠使用const和volatile修飾。 

virtual:

在基類中被定義為virtual的函式,派生類過載該函式不需要再次顯示說明該函式是virtual的。

inline, static, constructor三種函式都不能帶有virtual關鍵字。

inline是編譯時展開,必須有實體;

static屬於class自己的,也必須有實體;

virtual函式基於vtable(記憶體空間),constructor函式如果是virtual的,呼叫時也需要根據vtable尋找,但是constructor是virtual的情況下是找不到的,因為constructor自己本身都不存在了,建立不到class的例項,沒有例項,class的成員(除了public static/protected static for friend class/functions,其餘無論是否virtual)都不能被訪問了。

volatile

本意是"易變的",用它宣告的型別變數表示可以被某些編譯器未知的因素更改,比如作業系統、硬體或者其它執行緒等。遇到這個關鍵字宣告的變數,編譯器對訪問該變數的程式碼就不再進行優化,從而可以提供對特殊地址的穩定訪問。

當要求使用volatile 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被寄存。

相關文章