C++中重要關鍵字總
const 是一個左結合的型別修飾符,它與其左側的型別修飾符和為一個型別修飾符。const可以用於定義常量,可以限定函式的引用引數(因為傳值的引數根本不用限定),可以限定函式返回值為引用的情況。還有一個用法是修飾類的成員函式。這樣情況下,在類內的宣告和類外的定義都要加上const。
還有一種情況是,宣告類的const成員變數的時候,如何進行初始化。
在這種情況下,由於常量不能修改,所以只能在建構函式的初始化列表中進行復制初始化。如果同時宣告為了static時可以在類外進行初始化,但此時不能加static關鍵字。
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 宣告的變數的值的時候,系統總是重新從它所在的記憶體讀取資料,即使它前面的指令剛剛從該處讀取過資料。而且讀取的資料立刻被寄存。
相關文章
- C++中static關鍵字C++
- C++中的 const 關鍵字C++
- C++中的10個關鍵字C++
- C++中的typeid關鍵字C++
- C/C++中extern關鍵字詳解C++
- C++關鍵字explicitC++
- C++關鍵字decltypeC++
- Java物件導向重要關鍵字Java物件
- C/C++中volatile關鍵字詳解C++
- 【轉】C++ static關鍵字C++
- c/c++ const關鍵字C++
- 【C++】requires關鍵字簡介C++UI
- C++ explicit&noexcept關鍵字C++
- java中this關鍵字Java
- JavaScript中this關鍵字JavaScript
- 詳解C++的模板中typename關鍵字的用法C++
- 詳解 C++ 的模板中 typename 關鍵字的用法C++
- static關鍵字作用總結
- C++ typeid關鍵字詳解C++
- C++ 62個關鍵字的作用C++
- JAVA中的關鍵字Java
- javascript中的with關鍵字JavaScript
- Java transient關鍵字使用總結Java
- static關鍵字的使用總結
- c/c++常見關鍵字解釋C++
- C++ 的 new 關鍵字深入理解C++
- 為什麼async/await關鍵字是如此重要AI
- mysql 中的explain關鍵字MySqlAI
- Java中final關鍵字Java
- Java中this與super關鍵字Java
- ORACLE中ESCAPE關鍵字用法Oracle
- Javascript中this關鍵字詳解JavaScript
- java中this關鍵字的用法Java
- Python中nonlocal關鍵字Python
- java中的static關鍵字Java
- Java關鍵字理解與總結(未完)Java
- C++ 的關鍵字(保留字)完整介紹C++
- C++ operator關鍵字(過載操作符)C++