C++为自身使用保留了一组92个词(截至C++23)。这些词被称为关键字(或保留字),每个关键字在C++语言中都有特殊的含义。 以下是所有C++关键字的列表(截至C++23):
C++ 保留了一组 92 个关键字(截至 C++23),这些关键字称为保留字,每个关键字在 C++ 语言中都有特殊含义。以下是 C++ 关键字的完整列表(截至 C++23):
| 关键字 | 说明 | 
|---|---|
| alignas | 对齐说明符 | 
| alignof | 获取对齐要求 | 
| and | 逻辑与运算符( &&的替代写法) | 
| and_eq | 按位与赋值运算符( &=的替代写法) | 
| asm | 内联汇编语句 | 
| auto | 自动类型推导 | 
| bitand | 按位与运算符( &的替代写法) | 
| bitor | 按位或运算符( |的替代写法) | 
| bool | 布尔类型 | 
| break | 跳出循环或 switch 语句 | 
| case | switch 语句的分支标签 | 
| catch | 异常捕获块 | 
| char | 字符类型 | 
| char8_t(C++20) | UTF-8 字符类型 | 
| char16_t | UTF-16 字符类型 | 
| char32_t | UTF-32 字符类型 | 
| class | 类定义 | 
| compl | 按位取反运算符( ~的替代写法) | 
| concept(C++20) | 概念(用于模板约束) | 
| const | 常量修饰符 | 
| consteval(C++20) | 立即函数(编译时求值) | 
| constexpr | 常量表达式 | 
| constinit(C++20) | 常量初始化 | 
| const_cast | 常量类型转换 | 
| continue | 继续循环的下一次迭代 | 
| co_await(C++20) | 协程等待操作 | 
| co_return(C++20) | 协程返回操作 | 
| co_yield(C++20) | 协程生成操作 | 
| decltype | 推导表达式类型 | 
| default | 默认行为(switch/析构函数等) | 
| delete | 删除动态内存或函数 | 
| do | do-while 循环 | 
| double | 双精度浮点类型 | 
| dynamic_cast | 动态类型转换 | 
| else | if 语句的否定分支 | 
| enum | 枚举类型 | 
| explicit | 禁止隐式转换 | 
| export | 模板导出(已弃用) | 
| extern | 外部链接声明 | 
| false | 布尔假值 | 
| float | 单精度浮点类型 | 
| for | for 循环 | 
| friend | 友元声明 | 
| goto | 跳转语句 | 
| if | 条件语句 | 
| inline | 内联函数或变量 | 
| int | 整型 | 
| long | 长整型 | 
| mutable | 允许修改 const 成员变量 | 
| namespace | 命名空间 | 
| new | 动态内存分配 | 
| noexcept | 声明函数不抛出异常 | 
| not | 逻辑非运算符( !的替代写法) | 
| not_eq | 不等运算符( !=的替代写法) | 
| nullptr | 空指针字面量 | 
| operator | 运算符重载 | 
| or | 逻辑或运算符( ||的替代写法) | 
| or_eq | 按位或赋值运算符( |=的替代写法) | 
| private | 类私有成员 | 
| protected | 类保护成员 | 
| public | 类公有成员 | 
| register | 建议编译器将变量放入寄存器(已弃用) | 
| reinterpret_cast | 重新解释类型转换 | 
| requires(C++20) | 模板约束 | 
| return | 函数返回值 | 
| short | 短整型 | 
| signed | 有符号整数修饰符 | 
| sizeof | 获取类型或对象大小 | 
| static | 静态存储期或成员 | 
| static_assert | 编译时断言 | 
| static_cast | 静态类型转换 | 
| struct | 结构体定义 | 
| switch | 多分支选择语句 | 
| template | 模板定义 | 
| this | 当前对象的指针 | 
| thread_local | 线程局部存储 | 
| throw | 抛出异常 | 
| true | 布尔真值 | 
| try | 异常捕获块 | 
| typedef | 类型别名(建议使用 using替代) | 
| typeid | 获取类型信息 | 
| typename | 模板类型参数声明 | 
| union | 联合体定义 | 
| unsigned | 无符号整数修饰符 | 
| using | 类型别名或命名空间引入 | 
| virtual | 虚函数声明 | 
| void | 无类型 | 
| volatile | 易变性修饰符 | 
| wchar_t | 宽字符类型 | 
| while | while 循环 | 
| xor | 按位异或运算符( ^的替代写法) | 
| xor_eq | 按位异或赋值运算符( ^=的替代写法) | 
注意:标记为
(C++20)的关键字是在 C++20 中新增的。若编译器不支持 C++20,这些关键字可能无法使用。
关键字使用注意事项
标记为(C++20)的关键字是在C++20中添加的。如果您的编译器不是C++20兼容的(或者具有C++20功能,但默认情况下是关闭的),这些关键字可能无法正常工作。 C++还定义了特殊标识符:override、final、import和module。这些在某些上下文中使用时具有特定的含义,但通常情况下并不保留。 您已经遇到了一些关键字,包括int和return。除了一组操作符,这些关键字和特殊标识符定义了整个C++语言(不包括预处理器命令)。由于关键字和特殊标识符具有特殊的含义,您的IDE可能会改变这些词的文本颜色,使它们从其他标识符中脱颖而出。
完成本教程系列后,您将了解这些词的几乎所有用途!
标识符命名规则
作为提醒,变量(或函数、类型或其他类型的项)的名称称为标识符。C++为您提供了很大的灵活性来命名标识符。然而,在命名标识符时必须遵循一些规则:
- 标识符不能是关键字。关键字是保留的。
- 标识符只能由字母(小写或大写)、数字和下划线字符组成。这意味着名称不能包含符号(除了下划线)或空白(空格或制表符)。
- 标识符必须以字母(小写或大写)或下划线开头。它不能以数字开头。
- C++是区分大小写的,因此区分小写和大写字母。nvalue与nValue与NVALUE是不同的。
标识符命名最佳实践
现在您知道如何命名变量,让我们讨论应该如何命名变量(或函数)。
变量命名约定
按照C++的惯例,变量名应该以小写字母开头。如果变量名是一个单词或缩写,整个名称应该用小写字母书写。
int value; // 传统
int Value; // 非传统(应该以小写字母开头)
int VALUE; // 非传统(应该以小写字母开头并且全部小写)
int VaLuE; // 非传统(去看你的精神病医生);)
函数命名约定
大多数情况下,函数名也以小写字母开头(尽管在这方面有一些分歧)。我们将遵循这一惯例,因为所有程序都必须有的函数main(以及C++标准库中的所有函数)都是以小写字母开头的。
以大写字母开头的标识符名称通常用于用户定义的类型(例如结构体、类和枚举,我们将在后面介绍)。
多词标识符命名
如果变量或函数名称是多词的,有两种常见的约定:用下划线分隔的单词(有时称为snake_case),或者首字母大写(有时称为camelCase,因为大写字母像骆驼背上的驼峰一样突出)。
int my_variable_name;   // 传统(用下划线分隔/snake_case)
int my_function_name(); // 传统(用下划线分隔/snake_case)
int myVariableName;     // 传统(首字母大写/camelCase)
int myFunctionName();   // 传统(首字母大写/camelCase)
int my variable name;   // 无效(不允许有空格)
int my function name(); // 无效(不允许有空格) 
int MyVariableName;     // 非传统(应该以小写字母开头)
int MyFunctionName();   // 非传统(应该以小写字母开头)
在本教程中,我们通常使用首字母大写的命名方式,因为它更容易阅读(在密集的代码块中很容易将下划线误认为空格)。但也经常看到两者的混合:变量使用下划线方法,函数使用首字母大写。值得注意的是,如果您正在别人的代码中工作,通常认为最好匹配您正在工作的代码的风格,而不是严格遵循上述命名约定。
命名最佳实践
最佳实践:
- 在现有程序中工作时,使用该程序的约定(即使它们不符合现代最佳实践)。在编写新程序时使用现代最佳实践。
- 避免以下划线开头命名您的标识符。尽管在语法上是合法的,但这些名称通常保留给操作系统、库和/或编译器使用。
- 您的标识符名称应该清楚地表明它们持有的值的含义(特别是如果单位不明显)。标识符应该以一种方式命名,以帮助一个对您的代码一无所知的人尽快弄清楚。三个月后,当您再次查看您的程序时,您会忘记它是如何工作的,您会感谢自己选择了有意义的变量名。
然而,给一个微不足道的标识符一个过于复杂的名字,几乎和给一个非平凡的标识符一个不充分的名字一样,会妨碍对程序整体的理解。一个好的经验法则是使标识符的长度与其特定性和可访问性成比例。这意味着:
- 一个只存在于几个语句中的标识符(例如,在短函数的主体中)可以有一个更短的名称。
- 一个可以从任何地方访问的标识符可能受益于一个更长的名称。
- 代表一个非特定数字的标识符(例如,用户提供的任何东西)可以有一个更短的名称。
- 代表一个特定值的标识符(例如,以毫米为单位的内缝长度)应该有一个更长的名称。
变量命名示例
| 变量名 | 评价 | 说明 | 
|---|---|---|
| int ccount | 不好 | “count"前的"c"代表什么? | 
| int customerCount | 好 | 清楚我们在计数什么 | 
| int i | 两者都可以 | 如果使用是微不足道的,可以,否则不好 | 
| int index | 两者都可以 | 如果明显我们在索引什么,可以 | 
| int totalScore | 两者都可以 | 如果有且只有一个东西被评分,可以,否则太模糊 | 
| int _count | 不好 | 不要以下划线开头命名 | 
| int count | 两者都可以 | 如果明显我们在计数什么,可以 | 
| int data | 不好 | 这是什么类型的数据? | 
| int time | 不好 | 这是几秒、几分钟还是几小时? | 
| int minutesElapsed | 两者都可以 | 如果明显这是从什么时候开始的,可以 | 
| int x1, x2 | 两者都可以 | 如果使用是微不足道的,可以,否则不好 | 
| int userinput1, userinput2 | 不好 | 由于名字太长,很难区分这两个 | 
| int numApples | 好 | 描述性 | 
| int monstersKilled | 好 | 描述性 | 
