首页 > 其他分享 >顶层const和底层const

顶层const和底层const

时间:2024-05-07 12:11:26浏览次数:16  
标签:10 顶层 p1 const int 底层

什么是 顶层const底层const

顶层const:表示指针是一个常量。
底层const:表示指针所指向的对象是一个常量。

1、例子

指针中const

const int *const p = new int(10); 

第一个const是底层const ,第二个是顶层const。

普通变量中const

const int a = 10;
int const b = 10;

因为是普通变量所以不区分顶层或是底层const,不论const的位置在哪,都声明了这个变量不允许被修改。

引用中的const

const int ci = 10;
const int& c = ci;

用于声明引用的const都为底层const

2、原因

当执行对象的拷贝操作时,常量是顶层const还是底层const的区别明显。其中顶层const可以忽略,但是底层const不能忽略

我们进行分析:

const int *const p = new int(10);
int *p1 = p;
int *const p2 = p;
const int *p3 = p;

如下所示,我们忽略所有的顶层const:

const int* p = new int(10);
int *p1 = p;    //error:类型不一致
int *p2 = p;    //error:类型不一致
const int *p3 = p;  //right:变量类型一致

其次我们继续观察:

const int* p = new int(10);
int *p1 = p;    //error

此处我们未修饰p的指向,但是使用了const修饰了p的值。
如果第二句可以执行,我们可以接着执行这一句 * p1 = 10。那么
p的值也会发生改变,这和我们开始约定的 const int* p出现了冲突,所以出现错误。

还有一个容易出现的误区:

const int a = 10;
int *p4 = &a;   //error

这里 &a存放的是a的地址,const修饰a的值不可改变,但是没有说明a的地址不可以改变。我们将它看作一个指针,也就是a的地址可以进行改变,a中存放的内容不可改变。也就间接的可以看作是一个底层const修饰的 &a。底层const不可忽略,所以出现问题。
改正如下:

const int a = 10;
const int *p4 = &a; //同样是顶层const修饰

引用中的const



    int &r3 = r1;
    int &r4 = 40;

原则:

  • 引用不是对象且不会拷贝,所以和顶层const或者底层const的逻辑不通用
  • 常量引用如果在左侧,那么右侧可以接任何东西。
int *p1 = &c;
const int *p2 = &c;
const int *const p3 = &c;

const int &r1 = 20;
const int &r2 = *p1;
const int &r3 = *p2;
const int &r4 = *p3;
  • 非常量引用 = 常量 ×
int &r5 = 10;   //error
  • 引号在等号右侧时,忽略&
const int &r6 = 10;
int &r7 = r6;

//忽略等号右侧的&
int &r7 = const int r6;     //error:类型不匹配
  • 非常量 = 常量引用 √
int b = r6;

标签:10,顶层,p1,const,int,底层
From: https://www.cnblogs.com/baobaobashi/p/18174241

相关文章

  • WPF C# construct Grid,DataGrid,Button manually
    usingMicrosoft.Win32;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usin......
  • Redisson的看门狗机制底层实现
    1.看门狗机制概述看门狗机制是Redission提供的一种自动延期机制,这个机制使得Redission提供的分布式锁是可以自动续期的。privatelonglockWatchdogTimeout=30*1000;1看门狗机制提供的默认超时时间是30*1000毫秒,也就是30秒如果一个线程获取锁后,运行程序到释放锁所花费的时......
  • MyBatis学习总结 + 【手写MyBatis底层机制核心】
    MyBatis笔记MyBatis介绍MyBatis是一个持久层框架前身是ibatis,在ibatis3.x时,更名为MyBatisMyBatis在java和sql之间提供更灵活的映射方案mybatis可以将对数据表的操作(sql,方法)等等直接剥离,写到xml配置文件,实现和java代码的解耦mybatis通过SQL操作DB,建库建表......
  • 搞IT的为什么不建议搞底层(编译器、编程语言、)——当你搬进你的新家之后,你会在意这个楼
    文字表达引自:https://www.youtube.com/watch?v=KITqGv1qYg8当你搬进你的新家之后,你会在意这个楼是谁打的地基吗?你猜猜那些打地基的工人赚多少钱,卖你沙发电视机微波炉的人赚多少钱,当你在你温馨的小家里舒适的生活的时候,你会想这地基打的真好吗,只有一种情况下你会想到地基的事,就......
  • 底层架构
    一:角色分类(1)Coordinator协调器:协调器服务监视数据服务器上的历史服务。他们负责将区段分配给特定服务器,并确保区段在历史服务器之间保持良好的平衡。(2)Overlord:控制数据摄入任务的分配,Overlord服务监视数据服务器上的MiddleManager服务,并且是将数据摄取到Druid。他们负......
  • 蚂蚁面试:Springcloud核心组件的底层原理,你知道多少?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • Mysql锁机制与优化实践以及MVCC底层原理剖析
    学习来源-图灵课堂https://vip.tulingxueyuan.cn锁学习参考:https://juejin.cn/post/7307889500545253395  锁机制为了保证数据的一致性,当访问共享变量的时候我们可以针对共享数据加锁,但是加锁要时要注意加锁的成本,还有加锁的粒度,还有就是是否会发生死锁,还有就是发生了死锁......
  • 大厂50万节点监控系统架构设计&Prometheus底层源码级剖析
    大厂50万节点监控系统架构设计&Prometheus底层源码级剖析 设计和实现一个大规模监控系统需要深入考虑架构设计、可伸缩性、性能优化等方面。下面是一个关于大规模监控系统架构设计的简要指南,以及有关Prometheus底层源码的剖析:大规模监控系统架构设计:1.架构设计原......
  • const 和 constexpr
    修饰符const  const关键字让被修饰的对象为只读,不可以修改其值。应用场景  const的应用场景主要有三种,第一种是修饰普通变量,第二种是修饰指针或引用,第三种是修饰成员函数。常变量  可以读取变量,不可进行写入操作。//可以直接用常量初始化constinta=6;a......
  • python将图片添加到视频底层中(提高处理单个视频的效率)
    代码: importcv2importnumpyasnpimportosimportrandomfromconcurrent.futuresimportThreadPoolExecutor#图片文件夹路径image_folder_path=r'F:\jingguan\tu'#视频文件所在的文件夹路径video_folder_path=r'F:\jingguan\yuan'#输出视频文件夹路径ou......