新闻资讯
看你所看,想你所想

C++关键字

关键字(keyword千走湖延木古)属于保留字来自,是整个语言范360百科围内预先保留的标识符。每个C++关键续顺响字都有特殊的含义。经过预处理后,关键字从预处理记号(pr义和提倒但序斤随步eprocessing-token)中区别出来,剩下的标识符作为记号(token),用于声明对象、函数、类型、命名空间等。不能声明与关键字同名的标识符。

  • 中文名称 C++关键字
  • 外文名称 C++ keywords
  • 学科 计算机科学
  • 专业 程序设计

简介

  各个版本的ISO C++都规定以下划线接大写字母或下划线起始的标识符保留给实现,编译器可以用这些保留标识符作为扩展关键字,这不保证可移植性。

C++98/03 关键字

  ISO C++98/03关键字共63个,此处严格按标准原文排版:

  asm

  do

  if

  return

  typedef

  auto

  double

  inline

  short

  typ之超介以依控毛初文用eid

  bool

  dynamic_cast

  int

  signed

  typename

  break

  else

来自  long

  sizeof

  union

  case

 360百科 enum

  mutable

  static

  unsigned

  catch

  exp搞位后顶声黄licit

  namespace

  static_cast

  using

  ch号道初去均皇罪济ar

  export

  new

  struct

  virtual

  class

 答名铁常各年那解基 extern

  operator

  switch

  void

  const

  fal离五都掌se

  private

  templat完金义随宜导e

  volatile

  const_cast

  float

  protected

  this

界束静帮银兴假  wchar_t

  continue

  for

 律安模层海八汉衡包态胞 public

  throw

  while

  default

  fri承阶品虽派还唱end

  register

  true

  delete

  goto

  re北记最远象interpret_cast

  try

关键字的改变

  C++11 关键字共73个。

  新增关键字:alignas、alignof、char16_t、char32_t、constexpr、declt句屋罪念支国按ype、noexcept、nullptr、static_assert、办即往些亲帝未杂深烈某thread_local。

  auto 的意义改变。

 调负征拉零曾初供方究源 register 被视为道船克清肉活心钱余过时的(可能在未来标准移除)。

  export 因为实现支持太少(仅Edison Design Group的前端支持),仅电编译效率低下,取消原有意义(仍是关键字,但使用它的程序是养情右机蒸单积铁余严宪错误的),改为保留给未来标准使用。

C++11详解

alignas

  alignof补香女课离春班货用于获取取指定表达式指定的(类似sizeof,可以直接是类型名)的对齐(alignment)。alignas用于声明时指定对齐类似于现有的类型。和sizeof类似,两者的操作数都不被求值。

constexpr

  类似const但更强大,修饰函数或对象,表示函数结果或对象是编译时决定的常量,以便优化。(const不能修饰一般的函数,也不一定指定声明的对象能编译期的常量表达式,更可能只是只读对象。而在C语言中,const完全只能指定只读对象。)

char16_t 和 char32_t

  二者分别表示16位字符型和32位字符型,类似char和wchar_t,也是一般只专用于表示字符的整数类型,且设计上用于表示Unicode字符。char16_t和char32_t是C++11新增的,以克服wchar_t在不同平台上无法保证确定宽度的缺点。

decltype

  用于编译时推断类型。此外参与函数声明的另一种语法:指定返回auto,同时decltype引导trailing-return-type指定实际应该返回类型。decltype的操作数也不被求值。

nullptr

  字面量nullptr是具有std::nullptr_t类型的右值,是空指针常量。C++98/03中表示空指针常量的NULL或0都会在重载中引起混淆,而纯库的解决方案在这里也遇到困难,所以有必要加入新的关键字来专门表示空指针。

noexcept

  实践表明动态异常规范会影响运行时性能。新增的noexcept表示静态异常规范,只指定函数(模版)是否有异常抛出,这里noexcept即noexcept(true),表示没有异常抛出。除了异常规范,noexcept可以作用于一个表达式来判断是否有异常,这对于模版代码非常有用。

static_assert

  用于编译时的静态断言:若指定的表达式为false则编译失败。

auto

  C++11标准和C++98/03标准的auto是不同的。C++98/03标准中,auto表示自动储存类型 ;C++11标准中,auto表示由编译器静态判断其应有的类型 。

其它详解

asm

  用于语法:

  asm-definition:

  asm ( string-literal ) ;

  意义由实现定义,典型实现形了条常易中传输其中的字符串给汇编器。

a来自uto

  在C++98/03中这个这个关键字用于声明块中的变量的生存期为自动生存期,若是对象同时具360百科有自动存储类,即生存期在块结束时结束。这样的变量井全感底无目固背早钢被称为局部变量。这个关键字不常用,因为即便省略,声明的默认就是auto的。

  在C++11中,auto的含义改变为自动通过初值符推断声明的类型占位符。如声明auto i = 1;,auto就相当于int,因为1是int类型,可以推断出i的类型。也可以使用auto& i等声明,具体推导规则同模版参数类型推导。

*_cast

  即const_cast、dynamic_cast、reinterpret_cast、static_cast。

  C++风格的类型转换。dynamic_cast是动态的,需要运行时支持;其它都是静态检查,相比C风格的类型转换更加细化,增强了类型安全性。

bool,true,false

  bool即布尔类型,属于基本类型中的整数类型,取值为真和假。true司赵吸延真和false是具有bool类型的字面量,是右值,分别表示真和假。

break,continue,goto

  break用于跳出for或while循环或switch。continue用于跳转到循环起始。goto用于无条件跳转到函数内的标号。结构化程序较少使用goto,更多使用循环代替。

case,default,switch

  switch分支显该送田美易或冷语句的起始,根据switch条件跳转到case标号或defalut标记的分支上。

catch,throw,try

  用于异常处理。try指定try块的起始诗布酒成立算候战形,try块后的catch可以捕获异常。异常由throw抛出。throw在函数中还表示动态异常规率庆错触衡席对雨养孩击范,但在C++11中被标记为过时(由noexcept部分取代)。

char,wchar措照期_t

  表示字符型和宽字符型这些整数类型感的维必阳统垂声(属于基本类型),但一般只专用于表示字符压晚说简可苦就然。char(和signed char、unsigned char一起)事实上定义了字节的大小。

const,vol加班冲形按atile

  const和volatile是类型修饰符,语法类似,在C++中合称为cv-限定符(cv-qualifier)。可以共同使用。用于变量或函数参数声明,也可以儿春告做义华限制非静态成员函数。const表示只读类型(指定类型安全性,保护对象不被意外修改),volatile先阿玉味课和混指定被修饰的对象类型的读操作是副作用(因此读取不能被随便优化合并,适合映射I/O寄存器等)。

struct,class,union

  用于类型声明。class是一般的类类型。struct在C++中是特殊的类类型,声交记明中仅默认隐式的成员和基类访问限定与class不同(stru坚写厚海ct是public,class是private)。union是联合体类型。满足特定高声制线条件类类型--POD struct或POD union可以和C语言中的struct和union对应兼容。

  class还有个用途是在模版类型声明中作为表示模版类型参数或模版模版参数的语法的必要组成部分。前者也可被typename代替。

delete,new

  delete单独使用,表示释放具有动态存储期对象,默认版本调用全局的去配器(deallocator)::operator delete和析构函数。new单独使用,表示请求分配动态存储期对象,默认版本调用全局的分配器(allocator)::operator new和指定的析构函数。和operator连用表示分别表示去配器(operator delete)和分配器(operator new),用于释放分配器(allocator)的内存和分配内存。operator delete也在分配内存被异常中断时被调用。

do,for,while

  循环语句的组成部分。C++支持do-while循环、for循环和while循环。C++11新增了ranged-based for循环,用:分隔声明的对象和指定循环的范围。

数值类型

  即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的整数。

if,else

  条件语句的组成部分。if表示条件,之后else表示否定分支。

enum

  构成枚举类型名的关键字。C++11新增带作用域的枚举,用enum class或enum struct(两者等价)声明。

explicit

  这个关键字修饰构造函数声明,表示显式构造函数(模版),显式构造函数不参与特定的重载。

  C++11从两个角度扩展了用法。其一是适用于转换函数(模版),类似构造函数,避免不需要的重载。其二是列表初始化,除非直接使用std::initializer_list,显式构造函数被列表初始化忽略(在C++98/03中,explicit仅对单一参数调用构造函数有意义,这里打破了这个限制)。

export

  导出模版,用于分离编译。当初标准委员会未经充分实践支持匆忙通过了这一决定,被EDG证明具备不现实的可用性(即便EDG唯一地实现了这一个特性,他们也表示反对) 。MSVC、GCC、Clang等其它主流编译器前端都没有实现这一特性,甚至这是唯一明显约定不符合C++98/03的特性。C++11废除了这个export关键字的含义,但保留这个关键字,供以后使用 。

extern

  extern意为"外来的",是存储类声明修饰符。这个关键字在C语言中即很不明确,容易被混淆(尤其是extern inline--好在C++没有这种用法)。extern表示被修饰的声明中,名称的链接保持和之前的一致(若已有相同声明存在),或保持默认值(若之前没有相同名称的声明存在)--取决于声明的位置。在命名空间作用域(注意包括全局命名空间),extern表示外部链接;若这里省略extern,则对于const对象,默认具有内部链接;否则表示具有和命名空间一致的链接(若顶层没有嵌套未命名的命名空间,就是外部链接,否则是内部链接)。

  C++11新增extern用于模版显式实例化声明,表示不在当前翻译单元实例化模版,而在别处有定义。这可以提升编译效率。

friend

  声明友元,使其不受访问权限控制的限制。

inline

  声明定义内联函数(模版),提示编译时内联--将所调用的代码嵌入到主调函数中。注意是否内联取决于实现--编译器有权不实际内联,如果它认为这是必要的或更符合预期的目标代码质量。但inline还改变了ODR(One Definition Rule)的适用性。类似函数模版,在头文件直接定义inline函数不会视为重复定义违反ODR而编译出错。C++中,一个函数若声明inline,则每处声明都必须保证是inline,和C语言允许extern inline或static inline不同--尽管C++实现可以提供类似非标准的扩展。注意类成员函数若在类定义内给出定义则隐含inline。

  C++11中,新增inline namespace,指示命名空间中的名称同时是外层命名空间直接包含的名称。这便于命名空间的版本管理,减少冲突。

mutable

  用于类的非静态非const数据成员,表示不受到成员函数的const的限制,可以在const成员函数中使用。

namespace

  表示命名空间--其中可以声明若干标识符,组成的名称与其它命名空间不冲突。

  可以声明一个命名空间或命名空间别名。

operator

  和操作符连用,指定一个重载了的操作符函数,也包括operator new和operator delete。

private,protected,public

  指定类成员或基类中的名称的访问权限控制,分别表示仅供本类使用、供本类和派生类使用、不设限制。

register

  提示声明的对象被放入寄存器中以便得到更好的性能。同inline类似,并非强制;不同的是这个提示经常被现代的编译器无视,因此C++11中被标记为过时的。

return

  子程序返回语句,终止当前函数执行,使控制流返回到主调函数的调用后。若返回类型不是void可以同时带返回值。

static

  和C语言类似,声明静态存储期对象,或指定一个函数的名称具有内部链接。在C++还有另一个用途--用于类作用域声明,表示声明的成员是类共有的,不需要通过类的对象访问。类的静态数据成员也具有静态存储期,除非被thread_local修饰。

sizeof

  返回类型名或表达式具有的类型对应的大小。不能对函数使用(虽然可能有非标准扩展)。C++11新增支持直接对类的数据成员作为操作数(之前无法使用)。sizeof的操作数是不被求值的,利用这一点可以配合模版元编程测试类型正确性。

template

  声明一个模板、模版的特化或显式实例化(另见extern)。模版用于打破类型系统的某些限制,推迟类型检查到实例化得到具体的模版实例进行以复用代码,实现泛型和参数化编程。

this

  this是一种实体,仅在类的非静态成员中使用,是指向类的对象的指针右值。

typedef

  用以给数据类型取别名。字面名义上是定义,实际只是声明--这点和C语言的说法不同。

  C++11中可被using新增的用法代替。

virtual

  声明虚基类或虚函数。具有虚基类或虚函数的类是多态类(polymorphic class),需要运行时提供支持来判断成员函数调用分派到的具体类型。

typeid

  获取表达式的类型,以std::type_info表示结果,可能抛出std::bad_typeid。当操作数非多态类(引用)类型在编译时即可确定结果,否则需要在运行时取得结果,即RTTI。

typename

  告诉编译器一个嵌套的限定名(包含::)中的未知的标识符是一个类型。这只在模板中需要区分依赖名称时使用。

  另一种用法是在模版声明参数列表中表示模版类型参数,可被class代替。

using

  有两种基本用法:using声明和using指示(using namespace ...)。

  前者是声明,引入命名空间或基类作用域内已经被声明的名称。后者引入命名空间内所有的名称。

  C++11新增了一类用法,可以代替typename,同时可以配合template使用(typedef基于语法考虑未被允许加入这种用法)。

void

  特殊的"空"类型,指定函数无返回值或无参数(在参数列表中只能够唯一地使用),用于表达式转换为void类型以丢弃计算值的必要(C++11加入了discarded-value-expression显式地指出了这一点),或用于void*指针类型。

try

  try,C++中用于异常处理的组合。

C++而非C的关键字

alignas

  alignof

andand_eqasmbitand
bitorboolcatchchar16_tchar32_tclass
complconst_costconstexprdecltypedeletedynamic_cast
explicitfalsefriendinlinemutablenamespace
newnoexceptnotnot_eqnullptroperator
or_eqprivateprotectedpublicreinterpret_caststatic_cast
static_asserttemplatethisthread_localthrowtrue
trytypeidtypenameusingvirtualwchar_t
xorxor_eq

转载请注明出处安可林文章网 » C++关键字

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com