C++ 参考手册
- C++11
- C++14
- C++17
- C++20
- C++ 编译器支持情况表
- 独立与宿主实现
- C++ 语言
- 变量模板(C++14 起)
- 整数字面量
- 聚合初始化
- 比较运算符
- 默认比较(C++20 起)
- 转义序列
- for 循环
- while 循环
- 用户定义转换
- SFINAE
- 主函数
- ASCII 码表
- 标识符
- 类型
- 内存模型
- 对象
- 基本概念
- 表达式
- 声明
- 初始化
- 函数
- 语句
- 类
- 运算符重载
- 模板
- 异常
- 事务性内存
- 占位符类型说明符 (C++11 起)
- decltype 说明符
- 函数声明
- final 说明符 (C++11 起)
- override 说明符(C++11 起)
- 引用声明
- 移动构造函数
- 移动赋值运算符
- 枚举声明
- constexpr 说明符(C++11 起)
- 列表初始化 (C++11 起)
- 构造函数与成员初始化器列表
- using 声明
- nullptr,指针字面量
- 基础类型
- 类型别名,别名模版 (C++11 起)
- 形参包
- 联合体声明
- 字符串字面量
- 用户定义字面量 (C++11 起)
- 属性说明符序列(C++11 起)
- Lambda 表达式 (C++11 起)
- noexcept 说明符 (C++11 起)
- noexcept 运算符 (C++11 起)
- alignof 运算符(C++11 起)
- alignas 说明符 (C++11 起)
- 存储类说明符
- 基于范围的 for 循环 (C++11 起)
- static_assert 声明
- 隐式转换
- 代用运算符表示
- 自增/自减运算符
- 折叠表达式(C++17 起)
- 类模板实参推导(C++17 起)
- 模板形参与模板实参
- if 语句
- inline 说明符
- 结构化绑定声明 (C++17 起)
- switch 语句
- 字符字面量
- 命名空间
- 求值顺序
- 复制消除
- consteval 说明符 (C++20 起)
- constinit 说明符 (C++20 起)
- 协程 (C++20)
- 模块 (C++20 起)
- 约束与概念 (C++20 起)
- new 表达式
- do-while 循环
- continue 语句
- break 语句
- goto 语句
- return 语句
- 动态异常说明
- throw 表达式
- try 块
- 命名空间别名
- 类声明
- cv(const 与 volatile)类型限定符
- 默认初始化
- 值初始化(C++03 起)
- 零初始化
- 复制初始化
- 直接初始化
- 常量初始化
- 引用初始化
- 值类别
- C++ 运算符优先级
- 布尔字面量
- 浮点字面量
- typedef 说明符
- 显式类型转换
- static_cast 转换
- dynamic_cast 转换
- const_cast 转换
- reinterpret_cast 转换
- delete 表达式
- 构造函数与成员初始化器列表
- this 指针
- 访问说明符
- 友元声明
- virtual 函数说明符
- explicit 说明符
- 静态成员
- 默认构造函数
- 复制构造函数
- 复制赋值运算符
- 析构函数
- 类模板
- 函数模板
- 显式(全)模板特化
- 汇编声明
- C++ 的历史
- 作用域
- 生存期
- 定义与单一定义规则(ODR)
- 名字查找
- 有限定的名字查找
- 无限定的名字查找
- 如同规则
- 未定义行为
- 翻译阶段
- 常量表达式
- 赋值运算符
- 算术运算符
- 逻辑运算符
- 成员访问运算符
- 其他运算符
- sizeof 运算符
- typeid 运算符
- 指针声明
- 数组声明
- 语言链接
- 详述类型说明符
- 默认实参
- 变长实参
- 实参依赖查找
- 重载决议
- 重载函数的地址
- 注入类名
- 非静态数据成员
- 非静态成员函数
- 嵌套类
- 派生类
- 空基类优化
- 抽象类
- 位域
- 转换构造函数
- 成员模板
- 模板实参推导
- 部分模板特化
- sizeof... 运算符
- 待决名
- 函数 try 块
- 扩充命名空间 std
- 字母缩写
- RAII
- 三/五/零之法则
- PImpl
- 零开销原则
- 类型
- 隐式转换
- 注释
- C++ 关键词
- 预处理器
- C++ 标准库头文件
- 具名要求
- 功能特性测试 (C++20)
- 工具库
- 类型支持(基本类型、RTTI、类型特性)
- 概念库 (C++20)
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 容器库
- 迭代器库
- 范围库 (C++20)
- 算法库
- 数值库
- 输入/输出库
- 文件系统库
- 本地化库
- 正则表达式库
- 原子操作库
- 线程支持库
- 实验性 C++ 特性
- 有用的资源
- 索引
- std 符号索引
- 协程支持 (C++20)
- C++ 关键词
基础类型
(类型系统概览见类型,以及参阅 C++ 库提供的类型相关的工具列表)
void 类型
- void - 值为空集的类型。它是无法完成的不完整类型(从而不允许存在
void
类型的对象)。不存在void
的数组,亦不存在到void
的引用。然而容许void
的指针和返回void
类型的函数(其他语言中的过程)。
std::nullptr_t
定义于头文件 <cstddef>
|
||
typedef decltype(nullptr) nullptr_t; |
(C++11 起) | |
std::nullptr_t 是空指针字面量 nullptr 的类型。它是独立类型,既非指针类型,亦非成员指针类型。
布尔类型
整数类型
- int - 基本整数类型。若使用了下列任何修饰符则可省略关键词
int
。若无长度修饰符,则它保证拥有至少 16 位宽度。然而在 32/64 位系统上,几乎专门保证它拥有至少 32 位宽度(见后述)。
修饰符
修饰整数类型。能以任何顺序混合使用。类型名中每组只能有一个。
符号性
- signed - 目标类型将拥有有符号表示(若省略则此为默认)
- unsigned - 目标类型将拥有无符号表示
大小
- short - 目标类型将为空间优化,且将有至少 16 位的宽度。
- long - 目标类型将有至少 32 位的宽度。
|
(C++11 起) |
注意:与所有类型说明符相同,容许采用任何顺序: unsigned long long int 与 long int unsigned long 指名同一类型。
性质
下表总结了所有可用的整数类型及其在各种常用数据模型中的性质:
类型说明符 | 等价类型 | 按数据模型的位宽 | ||||
---|---|---|---|---|---|---|
C++ 标准 | LP32 | ILP32 | LLP64 | LP64 | ||
short
|
short int | 至少 16 | 16 | 16 | 16 | 16 |
short int
| ||||||
signed short
| ||||||
signed short int
| ||||||
unsigned short
|
unsigned short int | |||||
unsigned short int
| ||||||
int
|
int | 至少 16 | 16 | 32 | 32 | 32 |
signed
| ||||||
signed int
| ||||||
unsigned
|
unsigned int | |||||
unsigned int
| ||||||
long
|
long int | 至少 32 | 32 | 32 | 32 | 64 |
long int
| ||||||
signed long
| ||||||
signed long int
| ||||||
unsigned long
|
unsigned long int | |||||
unsigned long int
| ||||||
long long
|
long long int (C++11) |
至少 64 | 64 | 64 | 64 | 64 |
long long int
| ||||||
signed long long
| ||||||
signed long long int
| ||||||
unsigned long long
|
unsigned long long int (C++11) | |||||
unsigned long long int
|
注意:整数算术对有符号和无符号整数类型的定义是不同的。见算术运算符,特别是整数溢出。
std::size_t 是 sizeof 运算符还有 sizeof... 运算符及 alignof 运算符 (C++11 起)的结果的无符号整数类型。
参阅定宽整数类型。 (C++11 起)
数据模型
每个实现关于基础类型大小所做的选择被统称为数据模型。有四个数据模型广为接受:
32 位系统:
- LP32 或 2/4/4 ( int 为 16 位, long 和指针为 32 位)
- Win16 API
- ILP32 或 4/4/4 ( int 、 long 和指针为 32 位)
- Win32 API
- Unix 和类 Unix 系统( Linux 、 Mac OS X )
64 位系统:
- LLP64 或 4/4/8 ( int 和 long 为 32 位,指针为 64 位)
- Win64 API
- LP64 或 4/8/8 ( int 为 32 位, long 和指针为 64 位)
- Unix 和类 Unix 系统( Linux 、 Mac OS X )
其他数据模型很罕见。例如, ILP64 ( 8/8/8 : int 、 long 和指针为 64 位)只出现于某些早期 64 位 Unix 系统(例如 Unicos on Cray )。
字符类型
- signed char - 有符号字符表示的类型。
- unsigned char - 无符号字符表示的类型。亦用于审查对象表示(无修饰内存)。
- char - 能在目标系统上最有效地处理的字符表示的类型(拥有与 signed char 或 unsigned char 之一相同的表示和对齐,但始终是独立的类型)。多字节字符串用此类型表示编码单元。各字符类型均大到足够表示任何 UTF-8 的八位编码单元。 (C++14 起) char 的符号性取决于编译器和目标平台: ARM 和 PowerPC 的默认设置常为无符号,而 x86 与 x64 的默认设置常为有符号。
- wchar_t - 宽字符表示的类型(见宽字符串)。要求大到足以表示任何受支持的字符编码位点(支持 Unicode 的系统上为 32 位。值得注意的例外是 Windows,其中 wchar_t 为 16 位并保有 UTF-16 编码单元)。它与整数类型之一具有相同的大小、符号性和对齐,但它是独立的类型。
|
(C++11 起) |
|
(C++20 起) |
除了最小位数, C++ 标准还保证
- 1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long) 。
注意:这允许一种极端情况,其中字节有 64 位大小,所有类型(包括 char )都有 64 位宽,而 sizeof 对每个类型均返回 1。
浮点类型
- float - 单精度浮点类型。通常为 IEEE-754 32 位浮点类型
- double - 双精度浮点类型。通常为 IEEE-754 64 位浮点类型
- long double - 扩展精度浮点类型。不必映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。
性质
浮点类型支持一些特殊值:
- 无穷(正和负),见 INFINITY
- 负零, -0.0 。它与正零比较相等,但在某些算术运算中有意义,例如 1.0/0.0 == INFINITY ,但 1.0/-0.0 == -INFINITY) ,而且对某些数学函数有意义,例如 sqrt(std::complex)
- 非数 (NaN) ,它与任何值(包括自身)比较都不相等。多个位模式都表示 NaN ,见 std::nan 、 NAN 。注意 C++ 并不对发信 NaN 进行特殊对待,把所有 NaN 均当做静默 NaN,但提供了 std::numeric_limits::has_signaling_NaN 用以检测它们的支持情况。
实浮点数可用于算术运算符 + - / * 和各种来自 <cmath> 的数学函数。内建运算符和库函数都可能引发浮点异常,并按 math_errhandling 中的描述设置 errno 。
浮点表达式可拥有大于其类型所指定的值域和精度,见 FLT_EVAL_METHOD 。浮点表达式亦可收缩(contract),即如同所有中间值拥有无限范围和精度一般求值,见 #pragma STDC FP_CONTRACT 。
浮点数上的某些运算受浮点环境的状态影响,并对其进行修改(最值得注意的是舍入方向)。
在实浮点类型和整数类型间定义了隐式转换。
浮点类型的其他细节、界限和性质见浮点类型的界限和 std::numeric_limits 。
取值范围
下表提供常用数值表示的界限的参考。
C++20 之前,C++ 标准曾允许任意的有符号整数表示,而 N 位有符号整数的最小保证范围为从 -2N-1
+1 到 +2N-1
-1 (例如有符号 8 位类型为 -127 到 127 ),这对应于反码或原码的界限。
然而,所有 C++ 编译器均使用补码表示,而从 C++20 起,这是标准所允许的唯一表示,所保证的范围为从 -2N-1
到 +2N-1
-1 (例如有符号 8 位类型为 -128 到 127 )。
类型 | 位数 | 格式 | 取值范围 | |
---|---|---|---|---|
近似 | 精确 | |||
字符 | 8 | 有符号 | -128 到 127 | |
无符号 | 0 到 255 | |||
16 | 无符号 | 0 到 65535 | ||
32 | 无符号 | 0 到 1114111 (0x10ffff) | ||
整数 | 16 | 有符号 | ± 3.27 · 104 | -32768 到 32767 |
无符号 | 0 到 6.55 · 104 | 0 到 65535 | ||
32 | 有符号 | ± 2.14 · 109 | -2,147,483,648 到 2,147,483,647 | |
无符号 | 0 到 4.29 · 109 | 0 到 4,294,967,295 | ||
64 | 有符号 | ± 9.22 · 1018 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | |
无符号 | 0 到 1.84 · 1019 | 0 到 18,446,744,073,709,551,615 | ||
浮点 | 32 | IEEE-754 |
|
|
64 | IEEE-754 |
|
|
注意:这些类型可表示的值的实际界限(与保证的最小界限相对)可通过 <climits> 、 <cfloat> 及 std::numeric_limits 获知。
关键词
void, bool, true, false, char, wchar_t, char8_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double