深入理解 C++ 中的 const 和 constexpr

在 C++ 中,constconstexpr 是两个关键字,它们分别用于定义常量,但它们的使用场景和作用有所不同。理解它们的区别和联系对于编写高效和可靠的代码至关重要。

1. const 关键字

1.1 基本概念

const 关键字用于声明常量。被声明为 const 的变量在其整个生命周期中不能被修改。

1.2 用法示例

const int x = 5;
x = 10; // 错误:x 是只读变量

1.3 特点

  • 编译期检查:编译器会在编译时检查 const 变量的赋值操作,确保它们不会被修改。
  • 可以用于指针和引用const 还可以用来修饰指针和引用,表示指向的值不能修改。
const int *ptr = &x; // 指向 const int 的指针
int const *ptr2 = &x; // 同上,另一种写法
int *const ptr3 = &x; // const 指针,指针本身不可变
const int &ref = x; // 指向 const int 的引用

1.4 函数中的 const

在函数中,const 可以修饰函数参数和成员函数。

  • 修饰参数:表示参数在函数内部不可修改。
  • 修饰成员函数:表示成员函数不会修改类的成员变量。
void func(const int a) {// a 不能被修改
}class MyClass {
public:int getValue() const {return value; // 这个成员函数不会修改任何成员变量}
private:int value;
};

2. constexpr 关键字

2.1 基本概念

constexpr 关键字用于声明常量表达式。与 const 不同,constexpr 保证表达式在编译时求值。这意味着 constexpr 变量不仅是不可变的,而且其值在编译时就已经确定。

2.2 用法示例

constexpr int x = 5;
constexpr int y = x + 5; // 编译时求值

2.3 特点

  • 编译期常量constexpr 保证变量在编译时就能求值,从而可以用于数组大小、模板参数等需要编译时常量的地方。
  • 可以用于函数constexpr 函数的返回值在编译时求值,如果参数也是常量表达式。
constexpr int square(int x) {return x * x;
}constexpr int y = square(5); // 编译时求值

2.4 与 const 的区别

  • 编译时求值constexpr 强制在编译时求值,而 const 只是在运行时不可修改。
  • 应用场景constexpr 更适用于需要在编译时确定值的场景,如模板参数、数组大小等,而 const 更适用于需要不可变但不要求编译时确定的场景。

3. constconstexpr 的联系

尽管 constconstexpr 有显著的区别,但它们也有一些联系:

  • 不可变性:两者都可以用于定义不可变的变量。
  • 互补性:在实际编程中,constconstexpr 常常互补使用。例如,可以使用 constexpr 定义编译时常量,然后用 const 修饰函数参数来保证参数不可修改。
constexpr int size = 10;
const int arr[size] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

4. 实际编程中的应用

4.1 数组大小

使用 constexpr 可以定义数组的大小,使得数组大小在编译时确定。

constexpr int size = 10;
int arr[size];

4.2 模板参数

模板参数需要编译时常量,constexpr 非常适合用于此场景。

template<int N>
struct MyArray {int data[N];
};constexpr int size = 10;
MyArray<size> arr;

4.3 常量表达式函数

constexpr 函数可以在编译时求值,提高代码的执行效率。

constexpr int factorial(int n) {return n <= 1 ? 1 : n * factorial(n - 1);
}constexpr int result = factorial(5); // 编译时计算

5. 结论

constconstexpr 是 C++ 中两个重要的关键字,它们分别用于定义常量,但各自有不同的应用场景和特点。const 用于声明在运行时不可修改的变量,而 constexpr 用于声明在编译时即可求值的常量表达式。理解和正确使用这两个关键字,可以使代码更安全、高效和易于维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/34647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各式各样神奇的注意力机制变型

当输入sequence N很大的时候&#xff0c;这个时候self-attention 占据了绝大部分算力 Local Attention / Truncated Attention 只需要关注附近的attention, local attention 和cnn 差不多&#xff0c;可以加速计算&#xff0c;但效果不一定好 Stride attention 空几格attenti…

[保姆级教程]uniapp自定义标签页切换组件

文章目录 导文样式改成动态列表切换点击效果加上点击自动滑动scroll-view加上切换组件效果 导文 unaipp自带的标签页和ui设计相差太大&#xff0c;直接修改组件比手写一个还麻烦&#xff0c;下面手写一个。 样式 先用scroll-view做一个滑动&#xff0c;不然多的话滑动不了。 &l…

神经网络学习8-反向传播

back propagation 拿到前面传回来的L对z的偏导&#xff0c;再分别算损失值对x和w的偏导 反向传播 前馈过程求局部梯度 反向传播 这里的loss&#xff08;wxb-y)^2,第一个关于b的偏导为2(wxb-y),第二个关于w的为2w(wxb-y)

【机器学习300问】128、简述什么Word2Vec?

一、一句话说明Word2Vec是什么&#xff1f; Word2Vec是一种常见的词嵌入技术。Word2Vec的目标是将每个词表示为一个向量&#xff0c;使得这些向量能够反映出词语之间的相似性和关联性。 word2vec算法通过预测中心词和上下文词的共现概率来学习词向量&#xff0c;能够捕捉词语之…

SQLite 可以随可执行文件部署在用户机器吗

答案是&#xff1a;可以的。 sqlite 本身就是嵌入式的SQL数据库引擎&#xff0c;不需要单独的服务器进程。sqlite 直接读取和写入普通磁盘文件&#xff0c;sqlite 的整个数据库&#xff08;所有表、索引、触发器等&#xff09;都包含在单个磁盘文件中。所以 sqlite 很适合开发…

JAVA ZGC相关GC日志详情分析

可以通过设置 -Xlog:gc*:gc.log 选项以开启 ZGC 日志。其中 "gc*" 意为打印所有 tag 中以 "gc" 开头的日志&#xff0c;"gc.log" 为日志存储路径。 下面以 AutoMQ 在实际运行时的一次 GC 为例&#xff0c;按照不同的 log tag&#xff0c;解释 Z…

植物大战僵尸杂交版v2.1最新直装版,苹果+安卓+PC+防闪退工具+修改工具+高清工具+通关存档整合包更新

今天我要和各位聊聊一款让全网疯狂的游戏——《植物大战僵尸杂交版》。这可不是简单的游戏&#xff0c;它可是让B站的UP主“潜艇伟伟迷”一夜成名的大作&#xff0c;让无数玩家为之疯狂的魔改神作&#xff01; 记得2009年&#xff0c;《植物大战僵尸》横空出世&#xff0c;那时…

LDO芯片手册,实例应用分析

在进行电路设计时LDO是经常用到的&#xff0c;尤其在为芯片&#xff0c;晶振等敏感电路进行供电时应用更多&#xff0c;下面选取一款比较常用的LDO芯片&#xff0c;一起进行更深入的学习。 SGM2036特点简介 SGM2036&#xff0c;圣邦微一款比较常用的LDO芯片手册 可以先大致看…

【ajax实战04】数据管理平台——富文本编辑器

一&#xff1a;富文本编辑器简介 富文本&#xff1a;带样式&#xff0c;多格式的文本&#xff0c;在前端一般使用标签配合内联样式实现。 富文本编辑器&#xff1a;用于编写富文本内容的容器 二&#xff1a;wangEditor插件 https://www.wangeditor.com/ 对于将富文本编辑器…

MySQL 连接的使用方法与技巧

MySQL 连接是使用 MySQL 数据库的关键步骤之一。它允许用户通过网络与 MySQL 服务器建立通信&#xff0c;并执行各种数据库操作&#xff0c;如查询、插入、更新和删除数据。在本文中&#xff0c;我们将深入探讨 MySQL 连接的使用&#xff0c;包括连接的建立、配置和常见问题的解…

CAN通信协议

文章目录 STM32-CAN1. CAN基础知识2. CAN协议2.1. CAN协议与ISO/OSI基本参照模型的关系2.2. CAN协议及标准规格2.3. CAN协议2.3.1. 帧的种类2.3.2. 数据帧2.3.3. 遥控帧2.3.4. 错误帧2.3.5. 过载帧2.3.6. 间隔帧 2.4. 优先级的决定2.5. 位填充2.6. 错误的种类2.7. 位时序 3. CA…

鸿蒙系统最简单安装谷歌服务及软件的方法

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 近日&#xff0c;华为开发者大会在东莞松山湖召开&#xff0c;发布了盘古大模型5.0和纯血版的鸿蒙 HarmonyOS NEXT 全场景智能操作系统&#xff0c;而根据研究机构 Counterpoint Resea…

【linux/shell案例实战】awk实现浮点数四舍五入

使用printf格式化输出&#xff0c;实现保留小数位数四舍五入的功能 awk {printf "%.2f",$0}

ITSG、COST-G、Tongji和WHU Level-2数据产品读取绘图(Matlab)

数据介绍&#xff1a; ICGEM International Center for Global Gravity Field Models (gfz-potsdam.de) ITSG 2018&#xff1a;Institute of Geodesy at Graz University of Technolog&#xff08;格拉茨理工大学大地测量研究所&#xff09; 2018版本&#xff0c;最高60阶球谐…

Java导出excel合并行功能

导出的excel需要上下行相同的数据进行行合并的功能。如图显示 这里我使用的是项目框架自带的导出模板代码&#xff0c;是在这套模板基础之上做的修改。 // 我主要演示的就是mergeRows方法的操作&#xff0c;dataList是导出数据的集合。 workbook ExcelTools.expData(workbook…

【Linux】性能分析器 perf 详解(二)

上一篇:【Linux】性能分析器 perf 详解(一) 1、perf命令列表 annotate 读取perf.data(由perf record生成)并结合源代码展示详细的性能分析结果,包括CPU执行热点、函数调用栈等信息。archive 使用perf.data文件中找到的带构建标识符的对象文件创建归档文件,便于后续对这…

大厂面试官问我:Redis中热key和大key是怎么解决的?【后端八股文五:Redis热key和大key八股文合集】

往期内容&#xff1a; 大厂面试官问我&#xff1a;Redis处理点赞&#xff0c;如果瞬时涌入大量用户点赞&#xff08;千万级&#xff09;&#xff0c;应当如何进行处理&#xff1f;【后端八股文一&#xff1a;Redis点赞八股文合集】-CSDN博客 大厂面试官问我&#xff1a;布隆过滤…

【OceanBase诊断调优】—— 如何缩短OceanBase 数据库执行 count(*) 的时间

本文介绍影响 OceanBase 数据库执行 count(*) 时间的因素以及缩短 count(*) 执行时间的方法。 适用版本 OceanBase 数据库所有版本 执行 count(*) 的时间 OceanBase 数据库中&#xff0c;执行 count(*) 的时间不仅与选择的行数&#xff0c;还与行的长度相关。这是由于对主表…

振兴黄河新生力 打造文旅新地标——全国首家黄河会客厅在山东济南启幕

6月26日&#xff0c;由黄河文化发展工作站组织实施的全国首家黄河会客厅平台发布会暨山东基地启动仪式在济南成功召开。黄河会客厅以“民生黄河、生态动能、中华文明”为核心主题&#xff0c;融汇黄河智库、黄河文明、黄河产域、黄河金融、黄河科创、黄河物贸六大振兴赋能体系&…

计算机视觉:项目实战

目录 SSD1.安装ananconda2.安装cuda和cudnn3.配置Pytorch环境3.1 pytorch环境的配置与激活3.2 pytorch库的安装3.3 其它依赖库的安装 遇到的问题&#xff1a;1.EOFError: Ran out of input.2.No module named dlib. SSD 1.安装ananconda 见另一篇博文&#xff1a;https://blo…