-
C++關鍵字
鎖定
- 中文名
- C++關鍵字
- 外文名
- C++ keywords
- 學 科
- 計算機科學
- 專 業
- 程序設計
目錄
- 1 簡介
- ▪ 關鍵字
- ▪ 關鍵字的改變
- 2 C++11詳解
- ▪ alignas
- ▪ alignof
- ▪ constexpr
- ▪ char16_t
- ▪ char32_t
- ▪ decltype
- ▪ nullptr
- ▪ noexcept
- ▪ static_assert
- ▪ auto
- 3 其它詳解
- ▪ asm
- ▪ auto
- ▪ *_cast
- ▪ bool
- ▪ break
- ▪ case
- ▪ catch
- ▪ char
- ▪ const
- ▪ struct
- ▪ delete
- ▪ do
C++關鍵字簡介
C++關鍵字關鍵字
ISO C++98/03關鍵字共63個,此處嚴格按標準原文排版:
asm | do | if | return | typedef |
auto | double | inline | short | typeid |
bool | dynamic_cast | int | signed | typename |
break | else | long | sizeof | union |
case | enum | mutable | static | unsigned |
catch | explicit | namespace | static_cast | using |
char | export | new | struct | virtual |
class | extern | operator | switch | void |
const | false | private | template | volatile |
const_cast | float | protected | this | wchar_t |
continue | for | public | throw | while |
default | friend | register | true | - |
delete | goto | reinterpret_cast | try | - |
C++關鍵字關鍵字的改變
C++11 關鍵字共73個。
新增關鍵字:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local。
[3]
C++關鍵字C++11詳解
C++關鍵字alignas
C++關鍵字alignof
C++關鍵字constexpr
類似const但更強大,修飾函數或對象,表示函數結果或對象是編譯時決定的常量,以便優化。(const不能修飾一般的函數,也不一定指定聲明的對象能編譯期的常量表達式,更可能只是只讀對象。而在C語言中,const完全只能指定只讀對象。)
C++關鍵字char16_t
16位字符型,類似char和wchar_t,也是一般只專用於表示字符的整數類型,且設計上用於表示Unicode字符。char16_t是C++11新增的,以克服wchar_t在不同平台上無法保證確定寬度的缺點。
C++關鍵字char32_t
32位字符型,類似char和wchar_t,也是一般只專用於表示字符的整數類型,且設計上用於表示Unicode字符。char32_t是C++11新增的,以克服wchar_t在不同平台上無法保證確定寬度的缺點。
C++關鍵字decltype
C++關鍵字nullptr
字面量nullptr是具有std::nullptr_t類型的右值,是空指針常量。C++98/03中表示空指針常量的NULL或0都會在重載中引起混淆,而純庫的解決方案在這裏也遇到困難,所以有必要加入新的關鍵字來專門表示空指針。
C++關鍵字noexcept
實踐表明動態異常規範會影響運行時性能。新增的noexcept表示靜態異常規範,只指定函數(模版)是否有異常拋出,這裏noexcept即noexcept(true),表示沒有異常拋出。除了異常規範,noexcept可以作用於一個表達式來判斷是否有異常,這對於模版代碼非常有用。
C++關鍵字static_assert
用於編譯時的靜態斷言:若指定的表達式為false則編譯失敗。
C++關鍵字auto
C++關鍵字其它詳解
C++關鍵字asm
用於語法:
asm-definition:
asm ( string-literal ) ;
C++關鍵字auto
在C++98/03中這個這個關鍵字用於聲明塊中的變量的生存期為自動生存期,若是對象同時具有自動存儲類,即生存期在塊結束時結束。這樣的變量被稱為局部變量。這個關鍵字不常用,因為即便省略,聲明的默認就是auto的。
[6]
在C++11中,auto的含義改變為自動通過初值符推斷聲明的類型佔位符。如聲明auto i = 1;,auto就相當於int,因為1是int類型,可以推斷出i的類型。也可以使用auto& i等聲明,具體推導規則同模版參數類型推導。
[4]
C++關鍵字*_cast
即const_cast、dynamic_cast、reinterpret_cast、static_cast。
C++關鍵字bool
C++關鍵字break
C++關鍵字case
switch分支語句的起始,根據switch條件跳轉到case標號或defalut標記的分支上。
C++關鍵字catch
C++關鍵字char
表示字符型和寬字符型這些整數類型(屬於基本類型),但一般只專用於表示字符。char(和signed char、unsigned char一起)事實上定義了字節的大小。
C++關鍵字const
const和volatile是類型修飾符,語法類似,在C++中合稱為cv-限定符(cv-qualifier)。可以共同使用。用於變量或函數參數聲明,也可以限制非靜態成員函數。const表示只讀類型(指定類型安全性,保護對象不被意外修改),volatile指定被修飾的對象類型的讀操作是副作用(因此讀取不能被隨便優化合並,適合映射I/O寄存器等)。
C++關鍵字struct
用於類型聲明。class是一般的類類型。struct在C++中是特殊的類類型,聲明中僅默認隱式的成員和基類訪問限定與class不同(struct是public,class是private)。union是聯合體類型。滿足特定條件類類型——POD struct或POD union可以和C語言中的struct和union對應兼容。
class還有個用途是在模版類型聲明中作為表示模版類型參數或模版模版參數的語法的必要組成部分。前者也可被typename代替。
C++關鍵字delete
delete單獨使用,表示釋放具有動態存儲期對象,默認版本調用全局的去配器(deallocator)::operator delete和析構函數。new單獨使用,表示請求分配動態存儲期對象,默認版本調用全局的分配器(allocator)::operator new和指定的析構函數。和operator連用表示分別表示去配器(operator delete)和分配器(operator new),用於釋放分配器(allocator)的內存和分配內存。operator delete也在分配內存被異常中斷時被調用。
C++關鍵字do
C++關鍵字數值類型
即double、float、long、int、short、signed、unsigned。
signed和unsigned作為前綴修飾整數類型,分別表示有符號和無符號。signed和unsigned修飾char類型,構成unsigned char和signed char,和char都不是相同的類型;不可修飾wchar_t、char16_t和char32_t。其它整數類型的signed省略或不省略,含義不變。signed或unsigned可單獨作為類型,相當於signed int和unsigned int。
其它關鍵字表示整數類型。從佔用空間大小(sizeof)來看,保證char<=short<=int<=long<=long long。注意這些都不是相同的類型,即便大小和範圍都一致;各自具有unsigned版本。其中long long是C++11指定的不小於long的整數。
C++關鍵字if
條件語句的組成部分。if表示條件,之後else表示否定分支。
C++關鍵字enum
構成枚舉類型名的關鍵字。C++11新增帶作用域的枚舉,用enum class或enum struct(兩者等價)聲明。
C++關鍵字explicit
C++11從兩個角度擴展了用法。其一是適用於轉換函數(模版),類似構造函數,避免不需要的重載。其二是列表初始化,除非直接使用std::initializer_list,顯式構造函數被列表初始化忽略(在C++98/03中,explicit僅對單一參數調用構造函數有意義,這裏打破了這個限制)。
C++關鍵字export
導出模版,用於分離編譯。當初標準委員會未經充分實踐支持匆忙通過了這一決定,被EDG證明具備不現實的可用性(即便EDG唯一地實現了這一個特性,他們也表示反對)
[7]
。MSVC、GCC、Clang等其它主流編譯器前端都沒有實現這一特性,甚至這是唯一明顯約定不符合C++98/03的特性。C++11廢除了這個export關鍵字的含義,但保留這個關鍵字,供以後使用
[3]
。
C++關鍵字extern
extern意為“外來的”,是存儲類聲明修飾符。這個關鍵字在C語言中即很不明確,容易被混淆(尤其是extern inline——好在C++沒有這種用法)。extern表示被修飾的聲明中,名稱的鏈接保持和之前的一致(若已有相同聲明存在),或保持默認值(若之前沒有相同名稱的聲明存在)——取決於聲明的位置。在命名空間作用域(注意包括全局命名空間),extern表示外部鏈接;若這裏省略extern,則對於const對象,默認具有內部鏈接;否則表示具有和命名空間一致的鏈接(若頂層沒有嵌套未命名的命名空間,就是外部鏈接,否則是內部鏈接)。
C++11新增extern用於模版顯式實例化聲明,表示不在當前翻譯單元實例化模版,而在別處有定義。這可以提升編譯效率。
C++關鍵字friend
C++關鍵字inline
聲明定義內聯函數(模版),提示編譯時內聯——將所調用的代碼嵌入到主調函數中。注意是否內聯取決於實現——編譯器有權不實際內聯,如果它認為這是必要的或更符合預期的目標代碼質量。但inline還改變了ODR(One Definition Rule)的適用性。類似函數模版,在頭文件直接定義inline函數不會視為重複定義違反ODR而編譯出錯。C++中,一個函數若聲明inline,則每處聲明都必須保證是inline,和C語言允許extern inline或static inline不同——儘管C++實現可以提供類似非標準的擴展。注意類成員函數若在類定義內給出定義則隱含inline。
C++關鍵字mutable
用於類的非靜態非const數據成員,表示不受到成員函數的const的限制,可以在const成員函數中使用。
C++關鍵字namespace
表示命名空間——其中可以聲明若干標識符,組成的名稱與其它命名空間不衝突。
可以聲明一個命名空間或命名空間別名。
C++關鍵字operator
和操作符連用,指定一個重載了的操作符函數,也包括operator new和operator delete。
C++關鍵字private
指定類成員或基類中的名稱的訪問權限控制,分別表示僅供本類使用、供本類和派生類使用、不設限制。
C++關鍵字register
提示聲明的對象被放入寄存器中以便得到更好的性能。同inline類似,並非強制;不同的是這個提示經常被現代的編譯器無視,因此C++11中被標記為過時的。
C++關鍵字return
C++關鍵字static
和C語言類似,聲明靜態存儲期對象,或指定一個函數的名稱具有內部鏈接。在C++還有另一個用途——用於類作用域聲明,表示聲明的成員是類共有的,不需要通過類的對象訪問。類的靜態數據成員也具有靜態存儲期,除非被thread_local修飾。
C++關鍵字sizeof
返回類型名或表達式具有的類型對應的大小。不能對函數使用(雖然可能有非標準擴展)。C++11新增支持直接對類的數據成員作為操作數(之前無法使用)。sizeof的操作數是不被求值的,利用這一點可以配合模版元編程測試類型正確性。
C++關鍵字template
C++關鍵字this
this是一種實體,僅在類的非靜態成員中使用,是指向類的對象的指針右值。
C++關鍵字typedef
用以給數據類型取別名。字面名義上是定義,實際只是聲明——這點和C語言的説法不同。
C++11中可被using新增的用法代替。
C++關鍵字virtual
C++關鍵字typeid
C++關鍵字typename
告訴編譯器一個嵌套的限定名(包含::)中的未知的標識符是一個類型。這隻在模板中需要區分依賴名稱時使用。
另一種用法是在模版聲明參數列表中表示模版類型參數,可被class代替。
C++關鍵字using
有兩種基本用法:using聲明和using指示(using namespace ...)。
前者是聲明,引入命名空間或基類作用域內已經被聲明的名稱。後者引入命名空間內所有的名稱。
C++11新增了一類用法,可以代替typename,同時可以配合template使用(typedef基於語法考慮未被允許加入這種用法)。
C++關鍵字void
特殊的“空”類型,指定函數無返回值或無參數(在參數列表中只能夠唯一地使用),用於表達式轉換為void類型以丟棄計算值的必要(C++11加入了discarded-value-expression顯式地指出了這一點),或用於void*指針類型。
C++關鍵字C++而非C的關鍵字
alignas | alignof | and | and_eq | asm | bitand |
bitor | bool | catch | char16_t | char32_t | class |
compl | const_cost | constexpr | decltype | delete | dynamic_cast |
explicit | false | friend | inline | mutable | namespace |
new | noexcept | not | not_eq | nullptr | operator |
or_eq | private | protected | public | reinterpret_cast | static_cast |
static_assert | template | this | thread_local | throw | true |
try | typeid | typename | using | virtual | wchar_t |
xor | xor_eq | - | - | - | - |
- 參考資料
-
- 1. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:1998.美國:美國國家標準局 (ANSI),1989:14
- 2. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:2003.美國:美國國家標準局(ANSI),2003:14
- 3. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:2011.瑞士:國際標準化組織版權局(ISO copyright office),2011:23
- 4. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:2011.瑞士:國際標準化組織版權局(ISO copyright office),2011:156
- 5. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:2011.瑞士:國際標準化組織版權局(ISO copyright office),2011:221
- 6. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:1998.美國:美國國家標準局(ANSI),1998:46
- 7. 國際標準化組織(ISO), 國際電工委員會(IEC).ISO/IEC 14882:1998.美國:美國國家標準局(ANSI),1998:235