-
const
:- 用于声明常量变量,可以在编译时或运行时初始化。
- 适用于需要在运行时确定值的情况。
- 不能用于需要编译时常量表达式的地方。
-
constexpr
:- 用于声明编译时常量变量和函数。
- 确保值在编译时确定。
- 适用于需要编译时常量表达式的地方,如数组大小、枚举值、模板参数等。
const
-
定义:
const
关键字用于声明常量,表示该变量或对象的值在初始化后不能被修改。
-
编译时 vs 运行时:
-
const
变量可以在编译时或运行时初始化。如果在编译时可以确定其值,编译器可以将其视为常量,但并不是强制要求。 -
例如:
const int a = 10; // 编译时初始化 const int b = someFunction(); // 运行时初始化
-
-
使用场景:
-
用于声明常量变量、常量指针和常量引用。
-
可以用于函数参数,表示该参数在函数体内不会被修改。
-
例如:
void print(const std::string& s); // s 在函数体内不会被修改 const int* ptr; // 指针 ptr 指向的数据不能被修改 int* const ptr = &x; // 指针 ptr 不能被修改,但其指向的数据可以被修改
-
-
限制:
-
const
变量可以在运行时初始化,因此不一定能在编译时确定其值。 -
不能用于需要编译时常量表达式的地方,如数组大小、枚举值等。
-
例如:
int x = 10; const int y = x; int arr[y]; // 错误:y 不是编译时常量
-
constexpr
-
定义:
constexpr
关键字用于声明可以在编译时计算的常量表达式,确保其值在编译时确定。
-
编译时 vs 运行时:
-
constexpr
变量必须在编译时初始化,并且其值必须在编译时可以确定。 -
例如:
constexpr int a = 10; // 编译时初始化 constexpr int b = someConstexprFunction(); // 编译时初始化
-
-
使用场景:
-
用于声明编译时常量变量。
-
用于声明编译时常量函数,这些函数必须在编译时可求值。
-
用于数组大小、枚举值、模板参数等需要编译时常量表达式的地方。
-
例如:
constexpr int size = 10; int arr[size]; // 正确:size 是编译时常量
-
-
限制:
-
constexpr
函数必须满足一定的条件,如只能包含返回语句、变量声明、表达式求值等简单的语句,并且所有操作都必须在编译时可求值。 -
例如:
constexpr int add(int a, int b) { return a + b; // 正确:简单的表达式求值 } constexpr int complexFunction() { int x = 10; if (x > 5) { return x; } else { return 0; } // 错误:包含复杂的控制流 }
-
示例代码
#include <iostream>
// const 示例
const int a = 10;
int getRuntimeValue() {
return 20;
}
const int b = getRuntimeValue(); // 运行时初始化
// constexpr 示例
constexpr int c = 30;
constexpr int add(int x, int y) {
return x + y;
}
constexpr int d = add(10, 20); // 编译时初始化
int main() {
std::cout << "a: " << a << std::endl; // 10
std::cout << "b: " << b << std::endl; // 20
std::cout << "c: " << c << std::endl; // 30
std::cout << "d: " << d << std::endl; // 30
int arr[c]; // 正确:c 是编译时常量
// int arr2[b]; // 错误:b 不是编译时常量
return 0;
}