複製鏈接
請複製以下鏈接發送給好友

C++關鍵字

鎖定
關鍵字(keyword)屬於保留字,是整個語言範圍內預先保留的標識符。每個C++關鍵字都有特殊的含義。經過預處理後,關鍵字從預處理記號(preprocessing-token)中區別出來,剩下的標識符作為記號(token),用於聲明對象、函數、類型、命名空間等。不能聲明與關鍵字同名的標識符
中文名
C++關鍵字
外文名
C++ keywords
學    科
計算機科學
專    業
程序設計

目錄

  1. 1 簡介
  2. 關鍵字
  3. 關鍵字的改變
  4. 2 C++11詳解
  5. alignas
  6. alignof
  7. constexpr
  8. char16_t
  9. char32_t
  10. decltype
  11. nullptr
  12. noexcept
  13. static_assert
  1. auto
  2. 3 其它詳解
  3. asm
  4. auto
  5. *_cast
  6. bool
  7. break
  8. case
  9. catch
  10. char
  11. const
  12. struct
  13. delete
  14. do
  1. 數值類型
  2. if
  3. enum
  4. explicit
  5. export
  6. extern
  7. friend
  8. inline
  9. mutable
  10. namespace
  11. operator
  12. private
  13. register
  14. return
  1. static
  2. sizeof
  3. template
  4. this
  5. typedef
  6. virtual
  7. typeid
  8. typename
  9. using
  10. void
  11. 4 C++而非C的關鍵字

C++關鍵字簡介

各個版本的ISO 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
-
[1-2] 

C++關鍵字關鍵字的改變

C++11 關鍵字共73個。
新增關鍵字:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local。 [3] 
auto 的意義改變。 [4] 
register 被視為過時的(可能在未來標準移除)。 [5] 
export 因為實現支持太少(僅Edison Design Group的前端支持),編譯效率低下,取消原有意義(仍是關鍵字,但使用它的程序是錯誤的),改為保留給未來標準使用。 [3] 

C++關鍵字C++11詳解

C++關鍵字alignas

alignas用於聲明時指定對齊類似於現有的類型。和sizeof類似,兩者的操作數都不被求值。

C++關鍵字alignof

alignof用於獲取取指定表達式指定的(類似sizeof,可以直接是類型名)的對齊(alignment)。

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

用於編譯時推斷類型。此外參與函數聲明的另一種語法:指定返回auto,同時decltype引導trailing-return-type指定實際應該返回類型。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++11標準和C++98/03標準的auto是不同的。C++98/03標準中,auto表示自動儲存類型 [6]  ;C++11標準中,auto表示由編譯器靜態判斷其應有的類型 [4] 

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++風格的類型轉換。dynamic_cast是動態的,需要運行時支持;其它都是靜態檢查,相比C風格的類型轉換更加細化,增強了類型安全性。

C++關鍵字bool

bool即布爾類型,屬於基本類型中的整數類型,取值為真和假。true和false是具有bool類型的字面量,是右值,分別表示真和假。

C++關鍵字break

break用於跳出for或while循環或switch。continue用於跳轉到循環起始。goto用於無條件跳轉到函數內的標號結構化程序較少使用goto,更多使用循環代替。

C++關鍵字case

switch分支語句的起始,根據switch條件跳轉到case標號或defalut標記的分支上。

C++關鍵字catch

用於異常處理try指定try塊的起始,try塊後的catch可以捕獲異常。異常由throw拋出。throw在函數中還表示動態異常規範,但在C++11中被標記為過時(由noexcept部分取代)。

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++支持do-while循環、for循環和while循環。C++11新增了ranged-based for循環,用:分隔聲明的對象和指定循環的範圍。

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
double和float專用於浮點數,double表示雙精度,精度不小於float表示的浮點數。long double則是C++11指定的精度不小於double的浮點數。
其它關鍵字表示整數類型。從佔用空間大小(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++11中,新增inline namespace,指示命名空間中的名稱同時是外層命名空間直接包含的名稱。這便於命名空間的版本管理,減少衝突。

C++關鍵字mutable

用於類的非靜態非const數據成員,表示不受到成員函數的const的限制,可以在const成員函數中使用。

C++關鍵字namespace

表示命名空間——其中可以聲明若干標識符,組成的名稱與其它命名空間不衝突。
可以聲明一個命名空間或命名空間別名。

C++關鍵字operator

操作符連用,指定一個重載了的操作符函數,也包括operator new和operator delete。

C++關鍵字private

指定類成員或基類中的名稱的訪問權限控制,分別表示僅供本類使用、供本類和派生類使用、不設限制。

C++關鍵字register

提示聲明的對象被放入寄存器中以便得到更好的性能。同inline類似,並非強制;不同的是這個提示經常被現代的編譯器無視,因此C++11中被標記為過時的。

C++關鍵字return

子程序返回語句,終止當前函數執行,使控制流返回到主調函數的調用後。若返回類型不是void可以同時帶返回值

C++關鍵字static

C語言類似,聲明靜態存儲期對象,或指定一個函數的名稱具有內部鏈接。在C++還有另一個用途——用於類作用域聲明,表示聲明的成員是類共有的,不需要通過類的對象訪問。類的靜態數據成員也具有靜態存儲期,除非被thread_local修飾。

C++關鍵字sizeof

返回類型名或表達式具有的類型對應的大小。不能對函數使用(雖然可能有非標準擴展)。C++11新增支持直接對類的數據成員作為操作數(之前無法使用)。sizeof的操作數是不被求值的,利用這一點可以配合模版元編程測試類型正確性。

C++關鍵字template

聲明一個模板、模版的特化或顯式實例化(另見extern)。模版用於打破類型系統的某些限制,推遲類型檢查到實例化得到具體的模版實例進行以複用代碼,實現泛型和參數化編程。

C++關鍵字this

this是一種實體,僅在類的非靜態成員中使用,是指向類的對象的指針右值。

C++關鍵字typedef

用以給數據類型取別名。字面名義上是定義,實際只是聲明——這點和C語言的説法不同。
C++11中可被using新增的用法代替。

C++關鍵字virtual

聲明虛基類虛函數。具有虛基類或虛函數的類是多態類(polymorphic class),需要運行時提供支持來判斷成員函數調用分派到的具體類型。

C++關鍵字typeid

獲取表達式的類型,以std::type_info表示結果,可能拋出std::bad_typeid。當操作數非多態類(引用)類型在編譯時即可確定結果,否則需要在運行時取得結果,即RTTI

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