顶层const和底层const
在C++中,const修饰符用于声明常量,有两种常见的形式:顶层const和底层const,它们之间的区别在于它们修饰的对象及其在不同场景中的作用。
1. 顶层const (Top-level const)
顶层const用于修饰变量本身,使其成为常量。这意味着变量的值不能被修改。例如:
const int a = 10;
在这段代码中,a是顶层const,表示a的值不能被改变。
- 作用:限制变量本身,使其不能被修改。
- 应用场景:通常用于声明某个变量的值不可改变。
2. 底层const (Low-level const)
底层const则用于修饰指针或引用所指向的对象,使得通过指针或引用不能修改该对象的值。例如:
const int* ptr;
这里,ptr是一个指向int常量的指针,ptr本身可以指向不同的地址,但不能通过ptr修改所指向对象的值。
- 作用:限制指针或引用指向的对象的可修改性。
- 应用场景:用于指针或引用,使其无法修改所指向的对象的值。
例子区分顶层const和底层const:
int x = 5;
const int* p1 = &x; // p1是底层const,不能通过p1修改x的值
int* const p2 = &x; // p2是顶层const,不能改变p2指向的地址
const int* const p3 = &x; // p3既是顶层const又是底层const,既不能修改p3指向的地址,也不能修改x的值
p1是一个指向int常量的指针(底层const),可以改变指针的指向,但不能通过p1修改所指向对象的值。p2是一个常量指针(顶层const),即指针本身是常量,不能改变其指向的地址,但可以通过p2修改指向对象的值。p3同时是顶层和底层const,既不能修改指针的指向,也不能修改指针指向对象的值。
总结:顶层const用于限制变量本身的修改,底层const用于限制通过指针或引用修改所指向的对象。

我将逐行分析这些代码并解释其中的关键点,帮助你理解顶层const和底层const的作用。
const int a = 10;
int b = a;
a是顶层const,表示它是一个常量,值为10,不能被修改。b是一个普通的整数,它的值被初始化为a的值(即10),这在C++中是合法的,因为b不是const类型。
const int *const p = new int(10);
int *p1 = p; // 错误
int *const p2 = p; // 错误
const int *p3 = p;
p是一个顶层和底层const指针:const int*表示p指向一个const int(底层const),即通过p不能修改其所指向的值;const p(顶层const)表示p本身是一个常量指针,不能修改它指向的地址。p1的类型是int*,试图将const int*类型的p赋值给非const的p1,这是非法的,编译器会报错。因为p1可以修改所指向对象的值,但p不能。p2的类型是int *const,表示p2是一个常量指针,不能改变指向的地址,但可以通过p2修改指向对象的值。由于p是const int*,不能通过p2修改对象的值,因此也是非法的。p3的类型是const int*,与p兼容,因此可以赋值。
int *p4 = &a; // 错误
a是const int,但是p4是一个普通的int*,这意味着通过p4可以修改a的值。这是非法的,因为a是一个常量,不能通过普通指针来修改。
const int &r1 = 20;
int &r2 = a; // 错误
int &r3 = r1; // 错误
r1是一个对const int的引用,绑定到字面值20上,这是合法的,因为C++允许const引用绑定到字面值或常量表达式。r2是一个普通的引用,试图引用a,但a是const,不能通过非const引用绑定到常量。r3也是一个普通的引用,试图引用r1,但由于r1是const,r3不能通过非const引用绑定到一个const引用上。
结论:
- 顶层const限制变量本身的修改,如
p指向的地址不能被修改。 - 底层const限制通过指针或引用对对象值的修改,如
p指向的值不能被修改。 - 非const指针或引用不能指向const对象或通过非const引用绑定const对象。
p3的类型是const int*,与p兼容,因此可以赋值。这个如何理解
这句话的意思是:p3的类型是const int*,而p的类型是const int *const。虽然p是一个常量指针(顶层const),但它指向的是一个const int类型的值(底层const),因此p的底层类型与p3相同,都是指向const int的指针。
详细解释:
const int *const p = new int(10); // p 是 const 指针,指向 const int
const int *p3 = p; // p3 是指向 const int 的普通指针
-
p的类型:const int *const pconst int *:表示指针指向一个const int类型的对象(底层const),即不能通过该指针修改所指向的整数值。const p:表示p本身是一个常量指针(顶层const),也就是说指针的地址不能改变。
-
p3的类型:const int *p3const int *:表示指针p3指向一个const int类型的对象(底层const),即不能通过该指针修改所指向的整数值。
为什么p3可以赋值为p?
尽管p是一个常量指针(顶层const),但p3不需要关心p本身是否是常量指针,p3只关心p指向的对象类型(底层const)。由于p指向的是一个const int,这与p3的类型兼容,因此可以赋值。
具体来说:
p指向的是const int,这与p3的底层const要求兼容。- 赋值时,
p的顶层const(即指针本身不可修改)并不影响赋值给p3,因为p3本身不是常量指针,允许指针指向其他地址。
因此,p3可以指向与p相同的地址,但不能通过p3修改指向的值(因为是const int*)。
相关文章:
顶层const和底层const
在C中,const修饰符用于声明常量,有两种常见的形式:顶层const和底层const,它们之间的区别在于它们修饰的对象及其在不同场景中的作用。 1. 顶层const (Top-level const) 顶层const用于修饰变量本身,使其成为常量。这意…...
嵌入式Openharmony系统构建与启动详解
大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…...
锡林郭勒奶酪品牌呼和浩特市大召店盛大开业
礼献中秋,香飘乳都。为进一步拓展锡林郭勒奶酪区域公用品牌产品销售渠道,9月8日,锡林郭勒奶酪区域公用品牌大召店在呼和浩特市大召广场月明楼隆重开业,现场为第三批新授权的39家奶酪生产经营主体代表授牌。至此,锡林郭…...
【Java算法】模拟
🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🧣 一.模拟算法 模拟算法和传统的算法有一些不同之处,更多的是对题目要求的理解,通过代码的方式去模拟实现一道题目在现实中的实现方法…...
标准库标头 <filesystem> (C++17)学习之文件类型
本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...
基于51单片机的自动转向修复系统的设计与实现
文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...
mysql笔记4(数据类型)
数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的,而且会不停地变化。数据类型的选择方面没有一个统一的标准,但是应该符合业务、项目的逻辑标准。 菜鸟教程 Mysql 数据类型 文章目录 1. int类型2. 浮点数3. 定点数4…...
电脑开机出现no operation system found错误原因分析及解决方法
最近有网友问我电脑一启动提示:no operation system found,这个提示意思是未找到操作系统。并且出现bios能认别硬盘,快捷启动时找不到硬盘,出现该提示的原因有很多,下面我们来详细分析一下开机出现no operation system…...
数学建模笔记—— 主成分分析(PCA)
数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…...
@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
quill官方中文文档:https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意:想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装: npm install quilllatest 版本需要大于2.0版本 npm…...
gpp.bat,g++编译C++源文件的批处理
今天编写一个gpp.bat文件,是专门编译C源文件的批处理,内容如下: g %1.cpp -o %1.exegpp.bat的文件路径:D:\YcjWork\CppTour\gpp.bat 使用方法,在CMD下运行(//两个斜杠后面的内容是注释): //运行gpp.bat&…...
JDBC:连接数据库
文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址,就是要重写toString()方法,但是我现在还不知道怎么写 修改完的代码,但是数据库显示&#…...
【赵渝强老师】大数据主从架构的单点故障
大数据体系架构中的核心组件都是主从架构,即:存在一个主节点和多个从节点,从而组成一个分布式环境。下图为展示了大数据体系中主从架构的相关组件。 视频讲解如下: 大数据主从架构的单点故障 【赵渝强老师】大数据主从架构的…...
【AutoX.js】选择器 UiSelector
文章目录 原文:https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文:https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…...
Elasticsearch数据写入过程
1. 写入请求 当一个写入请求(如 Index、Update 或 Delete 请求)通过REST API发送到Elasticsearch时,通常包含一个文档的内容,以及该文档的索引和ID。 2. 请求路由 协调节点:首先,请求会到达一个协调节点…...
FreeRTOS-基本介绍和移植STM32
FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...
在C++中,如何避免出现Bug?
C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术,这些技术不仅帮助编写简单明了的代码&…...
Linux 操作系统 进程(1)
什么是进程 想要了解什么是进程,或者说,为什么会有进程这个概念,我们就需要去了解现代计算机的设计框架(冯诺依曼体系): 计算机从设计之初就以执行程序为核心任务,也就是运算器从内存中读取,也只从内存中…...
clickhouse-v24.1-离线部署
部署版本 数据库版本:24.1.1.2048 jdk版本:jdk8 4个文件(三个ck的包): OpenJDK8U-jdk_x64_linux_hotspot_8u382b05.tar clickhouse-client-24.1.1.2048.x86_64.rpm clickhouse-common-static-24.1.1.2048.x86_64.…...
安卓13删除app 链接库警告弹窗Detected problems with app native
总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码修改彩蛋1.前言 有些客户的APP,打开首次会弹窗提示窗口, Detected problems with app native libraries (please consult log for detail):,需要删除这个窗口,避免挡住用户APP。而且这个提示有些app是以t…...
每日热门skill:你的AI终于有“脑子“了!Memory MCP Server让Claude记住你的一切
告别"金鱼记忆",打造真正懂你的AI助手 一、开篇:那个让你崩溃的瞬间 你有没有遇到过这种情况? 昨天刚跟Claude说过:“我是做后端开发的,对Python比较熟悉,前端不太行。” 今天再问:“帮我写个React组件。” 它热情洋溢地回复:“好的!这是一个完整的全栈…...
AI Agent Harness Engineering 的能耗问题:绿色 AI 与推理成本的平衡艺术
AI Agent Harness Engineering 的能耗问题:绿色 AI 与推理成本的平衡艺术 摘要 随着自主 AI Agent 系统从实验性原型向生产级应用(如智能客服中心、智慧城市协同调度、工业机器人集群)的大规模渗透,传统以模型精度为核心的优化范式已无法满足可持续发展与商业可行性的双重…...
在openclaw中配置taotoken作为默认模型供应商的详细步骤
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在OpenClaw中配置Taotoken作为默认模型供应商的详细步骤 OpenClaw 是一款功能强大的 AI 智能体开发工具,它允许开发者灵…...
不变性假设下的PAC学习:从VC维到不变性VC维的样本效率提升
1. 项目概述:不变性假设下的PAC学习理论在机器学习领域,我们经常希望模型不仅能拟合训练数据,更能捕捉数据背后的本质规律,从而对未见过的数据做出可靠预测。PAC(Probably Approximately Correct)学习理论为…...
Codex vs. Claude Code:我的发现
“你试过 Codex 搭配 GPT-5.5 了吗?我刚用 40 分钟重建了整个认证模块。上周用 Claude 做同样的事花了三个小时。” 我回复了一句"有意思",然后继续做手头的事。我使用 Claude Code 已近一年,已经围绕它建立了整套工作流——CLAUD…...
实战指南:ComfyUI-Impact-Pack图像智能修复与细节增强解决方案
实战指南:ComfyUI-Impact-Pack图像智能修复与细节增强解决方案 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地址: …...
为什么92%的DeepSeek部署失败?揭秘量化校准中被忽略的3个KL散度阈值临界点
更多请点击: https://intelliparadigm.com 第一章:为什么92%的DeepSeek部署失败?揭秘量化校准中被忽略的3个KL散度阈值临界点 在真实生产环境中,DeepSeek-R1/Distill系列模型的INT4量化部署失败率高达92%,核心症结并非…...
5个AI音频处理神器:用OpenVINO插件让Audacity变身专业音频工作站
5个AI音频处理神器:用OpenVINO插件让Audacity变身专业音频工作站 【免费下载链接】openvino-plugins-ai-audacity A set of AI-enabled effects, generators, and analyzers for Audacity. 项目地址: https://gitcode.com/gh_mirrors/op/openvino-plugins-ai-auda…...
具身智能的发展趋势对就业市场的影响是什么?
具身智能对就业的核心影响是结构性重塑:短期替代大量重复性岗位、长期创造更高价值的新岗位,整体呈现 “替代 — 创造 — 转型” 的震荡再平衡过程。下面从替代、创造、结构变化、技能与分配、时间线五个方面展开。一、岗位替代:低技能、高重…...
OpenMemories-Tweak终极指南:5分钟解锁索尼相机所有隐藏功能
OpenMemories-Tweak终极指南:5分钟解锁索尼相机所有隐藏功能 【免费下载链接】OpenMemories-Tweak Unlock your Sony cameras settings 项目地址: https://gitcode.com/gh_mirrors/op/OpenMemories-Tweak 想要彻底解锁索尼相机的全部潜力吗?OpenM…...
