C++:const和constexpr两个关键字
在 C++ 中,constexpr
和 const
是两个关键字,用于定义常量,但它们有不同的语义和用途。以下是它们的详细对比和示例:
1. const
- 含义:表示变量是只读的,其值在程序运行期间不能被修改。
- 初始化:可以在运行时(run-time)进行初始化。
- 用法:
- 通常用于修饰变量、函数参数或返回值。
- 不能保证变量在编译期求值。
示例
const int x = 10; // 编译时常量
int y = 20;
const int z = y; // z 的值在运行时初始化
特点
const
变量可以指向编译期或运行期的值。- 可以用作指针修饰符:
const int* p = &x; // 指向常量的指针 int* const q = &y; // 常量指针 const int* const r = &x; // 指向常量的常量指针
2. constexpr
- 含义:表示变量或函数的值是常量表达式,必须在编译期可以确定。
- 初始化:要求表达式必须在编译时求值。
- 用法:
- 通常用于修饰常量或函数。
- 常与模板和编译时计算配合使用。
示例
constexpr int x = 10; // 编译时常量
constexpr int square(int n) { return n * n; } // constexpr 函数
constexpr int y = square(4); // 编译期计算,结果为 16
特点
constexpr
确保值在编译时已知,因此适用于需要编译期常量的场景(例如数组大小)。- 既可以用于修饰变量,也可以用于修饰函数:
constexpr int arrSize = 10; int arr[arrSize]; // 合法,因为 arrSize 是编译时常量
对比
特性 | const | constexpr |
---|---|---|
初始化时间 | 运行时或编译时 | 编译时 |
修饰范围 | 变量、指针、函数参数 | 变量、指针、函数 |
编译期常量要求 | 不要求 | 必须是编译期常量 |
主要用途 | 防止变量被修改 | 用于编译时常量计算和优化 |
示例 | const int x = 10; | constexpr int x = 10; |
混合使用
可以将 const
和 constexpr
一起使用:
constexpr int x = 10;
const int* ptr = &x; // 指向 constexpr 变量的 const 指针
但是不能将 constexpr
变量的地址赋给非 constexpr
修饰的指针,因为这样可能打破编译期常量的语义。
适用场景
-
使用
const
:- 如果变量的值在运行时才能确定。
- 如果只需要禁止变量的修改,不关心编译期计算。
-
使用
constexpr
:- 如果需要强制在编译时求值(例如模板元编程、数组大小、性能优化)。
- 编译期常量计算函数的定义。