C++:const和constexpr两个关键字

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)

在 C++ 中,constexprconst 是两个关键字,用于定义常量,但它们有不同的语义和用途。以下是它们的详细对比和示例:


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;

混合使用

可以将 constconstexpr 一起使用:

constexpr int x = 10;
const int* ptr = &x;  // 指向 constexpr 变量的 const 指针

但是不能将 constexpr 变量的地址赋给非 constexpr 修饰的指针,因为这样可能打破编译期常量的语义。


适用场景

  1. 使用 const

    • 如果变量的值在运行时才能确定。
    • 如果只需要禁止变量的修改,不关心编译期计算。
  2. 使用 constexpr

    • 如果需要强制在编译时求值(例如模板元编程、数组大小、性能优化)。
    • 编译期常量计算函数的定义。

网站公告

今日签到

点亮在社区的每一天
去签到