c++++中定义常量的两种方式是const和constexpr。1. const表示运行时常量,强调变量初始化后不可修改,但其值不一定在编译期确定;2. constexpr表示编译期常量,要求值必须在编译期计算完成,适用于数组大小、模板参数等需要常量表达式的场景。const可以延迟初始化,而constexpr必须在编译期完成初始化。constexpr提供更强的保证和更多灵活性,优先用于需编译期计算的场合。

在C++中,定义常量的方式有两种常见方式:const 和 constexpr。虽然它们都能用来表示不可变的值,但使用场景和语义上还是有些区别的。简单来说:

-
const表示“运行时常量”,强调变量一旦初始化就不能修改。 -
constexpr则更进一步,要求其值在编译期就能确定,适用于更严格的常量表达式环境。
理解这两个关键字的区别,能帮助你写出更高效、更安全的代码。

const 是运行时的“只读变量”
const 是 C++ 中最早引入的常量机制,它的主要作用是告诉编译器“这个变量不能被修改”。
立即学习“C++免费学习笔记(深入)”;
const int MaxValue = 100;
这行代码定义了一个名为 MaxValue 的整型常量,后续尝试修改它会导致编译错误。

使用要点:
- 可以延迟初始化:比如可以在运行时通过函数返回值赋值。
- 不是真正的编译时常量:因此不能用作数组大小等需要编译期常量的地方(除非是字面量类型且立即初始化)。
-
修饰指针时要注意:
const int* p和int* const p含义不同。
例如:
const int* p = &a; // 指向的内容不能改 int* const p = &a; // 指针本身不能改
constexpr 是编译期就确定的常量表达式
constexpr 出现在 C++11 中,用于声明“常量表达式”。这类变量必须在编译时就能计算出结果。
constexpr int Square(int x) {
return x * x;
}
constexpr int size = Square(5); // 编译时计算为25这样的好处是可以提升性能,还能用在模板参数、数组大小等需要常量表达式的上下文中。
使用建议:
- 只能接受编译期可求值的表达式。
- 函数也可以是
constexpr,前提是函数体足够简单,能在编译期展开。 - 支持用户自定义类型,只要构造函数也能满足编译期执行的要求。
const 和 constexpr 的区别总结
| 特性 | const | constexpr |
|---|---|---|
| 初始化时机 | 运行时或编译期 | 必须是编译期 |
| 是否能在编译期使用 | 不一定(视情况而定) | 肯定可以 |
| 是否能作为模板参数 | 否 | 是 |
| 是否能作为数组大小 | 否(除非是字面量常量) | 是 |
举个例子:
const int N = 10; int arr[N]; // 有时可以,取决于编译器支持 constexpr int M = 20; int arr2[M]; // 完全没问题
实际开发中怎么选?
- 如果你只是想让某个变量不能被修改,用
const就够了。 - 如果你需要这个值在编译期就知道,并参与常量表达式(如数组大小、模板参数),那就应该用
constexpr。 - 在现代 C++ 中,优先考虑
constexpr,因为它提供了更强的保证和更多的灵活性。
基本上就这些。
关键在于理解什么时候需要编译期的常量,什么时候只需要运行时的只读保护。










