当前位置: 首页 > article >正文

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

在 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 是编译时常量
    

对比

特性constconstexpr
初始化时间运行时或编译时编译时
修饰范围变量、指针、函数参数变量、指针、函数
编译期常量要求不要求必须是编译期常量
主要用途防止变量被修改用于编译时常量计算和优化
示例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

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

http://www.kler.cn/a/470856.html

相关文章:

  • 深入理解 React 中 setState 的行为及状态更新时机
  • 前端基础--网络
  • Spring Boot项目中使用单一动态SQL方法可能带来的问题
  • Golang开发-案例整理汇总
  • 卸载wps后word图标没有变成白纸恢复
  • 计算机网络 —— 网络编程实操(1)(UDP)
  • 【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
  • springboot+vue实现SSE服务器发送事件
  • 【OceanBase】利用 OceanBase 向量检索能力构建文档智能问答小助手
  • 6 网络编程
  • 小程序组件 —— 26 组件案例 - 跳转到商品列表
  • Unity-Mirror网络框架-从入门到精通 总目录
  • C# delegate 委托使用教程
  • 【Linux】sed编辑器
  • 周记-Repeater中的children和item区别
  • Go语言的 的抽象类(Abstract Classes)核心知识
  • 图数据库 | 17、高可用分布式设计(上)
  • Elixir语言的学习路线
  • 像素越多越好?像元的面积越小越好?
  • QT ---------------数据库编程概要
  • 自组织映射 (Self-Organizing Map, SOM) 算法详解与PyTorch实现
  • XXL-RPC v1.8.1 | RPC服务框架
  • 去耦电容理解:“耦”了什么?非要“去”了?
  • Bash语言的软件工程
  • 模电面试——设计题及综合分析题0x03(含答案)
  • Android:文件管理:打开文件意图