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 | 好 | 描述性 |