news 2026/8/21 11:27:52

C++ 顶层const和底层const

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 顶层const和底层const

咱们先看一下这个例子

int m const int n; const int *p1=&n; int *const p2=&m; const int *const p3=&n;

想要弄清楚这些声明的含义最行之有效的方法就是从右向左阅读,此例中,离p2最近的符号是const,意味着p2本身是一个常量对象,对象的类型由声明符的其余部分确定。声明符中的下一个符号是*,意思是p2是一个常量指针。最后,该声明语句的基本数据类型部分确定了常量指针指向的是一个int对象。与之相似,我们也能推断出p3是一个常量指针,它指向的对象是一个int型常量。但这些一个声明中出现多个const,这const有什么区别吗?

众所周知,指针本身是一个对象,它又可以指向另外一个对象。因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题。用名词顶层const表示指针本身是个常量,而用名词底层const表示指针所指的对象是一个常量。

更一般的,顶层const可以扩展到任意数据类型,而底层const则与指针和引用等复合数据类型的基本类型部分(即上面例子中基本数据类型如int的左部分)有关。例如:

int i=0; int *const p1=&i; //顶层 const int ci=42; //顶层 const int *p2=&ci; //底层 const int *const p3=p2; //底层 顶层 const int &r=ci; //底层 用于声明引用的const都是底层const int &const r1=i; //非法,引用不是对象,只是指向对象的“别名”

此例中也简单介绍了引用的区别

当执行对象的拷贝操作时,常量是顶层const还是底层const区别明显。其中,顶层const不受影响:

i=ci; p2=p3; p2=&i; i=*p2

执行拷贝操作并不会改变被拷贝对象的值,因此,拷入和拷出的对象是否是常量都没什么影响。

另一方面,底层const的限制却不能忽视。当执行对象的拷贝操作时,拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说,非常量可以转换为常量,反之则不行:

int *p=p3; //非法,p3包含底层const的定义,意味着p3指向的内容不可以改变 //如果将p3赋给p,那么就可以通过p间接修改p3指向的内容,那其p3的底层const将毫无意义 p2=p3; p2=&i; //int*可以转化成const int* int &r=ci; //非法 const int &r2=i;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/21 11:27:03

Swin Transformer目标检测实战:从原理到PyTorch部署调优指南

1. 从“能用”到“用好”:Swin Transformer目标检测的核心价值如果你正在找一个能兼顾精度和速度、并且对显存友好的目标检测方案,Swin Transformer绝对值得你花时间研究。它不像一些纯Transformer模型那样“吃”资源,也不像传统CNN那样在全局…

作者头像 李华
网站建设 2026/8/21 11:26:47

AI Agent从Demo到上线:避开五大工程化陷阱,实现企业级稳定部署

“我们团队开发的智能客服Agent,Demo演示时对答如流,老板看了直呼‘未来已来’。结果一上线,用户问‘怎么修改密码’,它开始引用《论语》讲‘克己复礼为仁’。项目直接翻车,团队集体加班到凌晨三点。”这不是段子&…

作者头像 李华
网站建设 2026/8/21 11:26:31

Spring Boot与消息队列组合在大厂面试中的核心考察点

1. 面试场景解析:为什么大厂偏爱Spring Boot与消息队列组合?在头部互联网企业的Java技术面试中,Spring Boot与消息队列的组合考察频率居高不下。这种技术组合之所以成为面试热点,本质上反映了现代分布式系统的核心诉求&#xff1a…

作者头像 李华
网站建设 2026/8/21 11:25:16

信息学奥赛周赛实战:从解题框架到代码实现,稳定提升竞赛成绩

最近很多家长和刚开始接触信息学奥赛的同学都在问同一个问题: “刷了很多题,但一到周赛、模拟赛就卡壳,成绩总是不稳定,问题到底出在哪?” 这背后反映的,不是一个简单的“题量不够”或“知识点没学”&am…

作者头像 李华
网站建设 2026/8/21 11:24:36

MySQL锁表原因及3大解锁技巧

MySQL 锁表是一个常见的性能问题,其根本原因在于并发事务或操作对同一资源(如表、行)的争用。理解其原因并掌握快速解锁方法,对于数据库的稳定运行至关重要。 一、 MySQL 锁表的主要原因 锁表现象通常由以下操作或场景触发&…

作者头像 李华
网站建设 2026/8/21 11:22:00

第216篇 Informed RRT*——用启发式信息加速收敛

上篇讲了RRT*——路径渐进最优,但收敛慢。问题出在哪?RRT在整个空间里均匀采样,大部分采样点对优化当前路径没有帮助。说白了,它在浪费时间在无关区域。Informed RRT的核心思想就是:找到第一条路径后,用一个…

作者头像 李华