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

顶层Const和底层Const

时间:2023-09-10 11:25:12浏览次数:27  
标签:顶层 const 常量 int 引用 Const 底层 指针

说的都是指针类型,只有指针有这种说法

顶层const:         int * const p = a     表明指针本身的值(指向)是常量无法修改,也无法转化为int *类型。即便是const_cast试图去掉这样的顶层const属性也不可以。

底层const:         int const * p = a.    表明指针指向的对象是常量,无法通过指针进行解引用去修改对象的值,但是可以通过const cast 去除底层const然后拷贝构造一个指向普通类型的指针,用这个指针去修改值。

 

const还分两种,全局作用域下的const跟在某个函数体内的const。全局const也是声明了只有在当前源文件内才可以使用这个const,同时它会被存储在常量区,程序只有读和执行的权限没有写权限,而函数中的const是存在函数的栈帧里的,可以通过对其取地址构造指针之后解引用。

 

全局作用域下的const变量可以在一个头文件里定义,然后其他cpp文件引用她都没问题,每一个cpp源文件都会有自己独立的一份,这个常量区里头的不允许修改。

而非const类型的变量在头文件里定义的花就会有重复定义的问题,需要使用extern表明是在其他文件中被定义,而在此文件中无法再初始化了。

 

赋值问题
const int ci = 0; int &a = ci; 报错,引用类型必须与被引用的对象类型一致 但是有例外的特殊情况 可以把常量引用绑定到非常量上 只要基本类型一致并且能转为常量引用比如 int i = 0; const int &a = i; const int ci = 0; int *a = &ci;报错非常量指针无法指向常量。 int i = 0; const int *a = &i; 底层const 指针常量可以指向非常量,无法通过a修改i

如果是顶层const,那么解引用之后能否修改对象的值,取决于对象是常量还是非常量。
int a = 0;
int *const ai = &a;
*ai = 1;没问题

const int ap = 0;
int* const api = ≈
*api = 1;报错

至于如果试图修改顶层const的值(指向)那么直接报错。

 

关于引用中的const,全部都是底层const,即对象的值是否能改变,因为所有引用在定义时都已经绑定了对象之后所以不存在顶层const

 

 

关于顶层const和底层const的不同拷贝操作。

如果是顶层const,那它的指向是无法改变的,可以被赋值

以下两句都没问题 注意因为它有顶层const

const int * const p3 = p2;p3顶层const,p2没有

p2 = p3 。p2没有 p3有 也没问题执行之后p2还是没有顶层const。只是给了指向。

 

这块还是有点模糊

标签:顶层,const,常量,int,引用,Const,底层,指针
From: https://www.cnblogs.com/synapse331/p/17690905.html

相关文章

  • 制造业数字化转型顶层设计业务架构和应用架构规划方法
     引言   当前制造业产业转型升级已成为国家战略,智能制造的理念也在行业中快速推行和应用。在当下制造业数字化转型的浪潮中,数字化顶层规划以企业架构方法论为依托,围绕数字化转型规划战略,帮助企业识别企业在转型过程中应该具备的核心业务能力,构建企业数字化运营能力总体蓝图,......
  • C++之进化后的 const 分析
    @TOC前言从C演变而来的C++是一种功能更为丰富和面向对象的编程语言。在C++中,const关键字用于表示常量,其用法与C中的const有了一些进化和扩展。本文将探讨C到C++的const的进化,以及在C++中使用const的一些特性和用法。C语言中的constconst修饰的变量是只读的,本质上还是变量。const修......
  • MindSponge分子动力学模拟——Constraint约束
    技术背景在前面的几篇博客中,我们已经介绍了MindSponge的基本使用方法,比如定义一个分子系统、计算分子的单点能以及迭代器的使用等。有了这些基础的教程,用户以及可以执行一些比较简单的模拟任务,比如可以跑一个能量极小化,或者是NVT过程。当我们去执行一个模拟任务时,比较关键的一个......
  • ES6前端技术之第二讲 let和const命令
    第二讲let和const命令前人栽树后人乘凉,前人挖坑后人遭殃!!!JS是弱类型语言,当初设计者为了使用的便捷,开发人员开心,留下了不少坑。请看JS系列坑之技术细节:var关键字挖的坑1.可以重复声明变量vara=88;vara="张老师";console.log(a);填坑:ES,let关键字......
  • IRIS路由注册(接路由底层分析)
    IRIS路由注册实例化完Application对象,接着就是路由注册了。也就是类似下面的代码  看看api.Get 实现我们主要看app.Get("/home",HomeHandler)这个函数的实现。进入该Get函数的源码,发现调用者是APIBuilder结构体,如下:这是因为在Application结构体中嵌套了router.APIBuild......
  • PPT| 埃森哲制药企业数字化转型项目顶层规划方案P236
    本人从事咨询工作多年,二十年一线数字化规划咨询经验,提供制造业数智化转型规划服务,顶层规划/企业架构/数据治理/数据安全解决方案资料干货.【智能制造数字化咨询】该PPT共236页,由于篇幅有限,以下为部分资料,如需完整原版 方案,点击右上角红色按钮关注+私信。......
  • 【Qt初入江湖】Qt QSqlQueryModel 底层架构、原理详细描述
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen) QtQSqlQueryModel是Qt中用于实现自定义SQL查询的模型类,它继承自QAbstractTableModel。QSqlQueryModel封装了对数据库查询结果的处理,可......
  • 【Qt初入江湖】Qt QSqlRelationalDelegate 底层架构、原理详细描述
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen) Qt的QSqlRelationalDelegate类是用于在Qt模型/视图框架中使用带有外键关系的数据库表格数据的委托类。它提供了一组用于在表格视图......
  • 图解Spark Graphx基于connectedComponents函数实现连通图底层原理
    原创/朱季谦第一次写这么长的graphx源码解读,还是比较晦涩,有较多不足之处,争取改进。一、连通图说明连通图是指图中的任意两个顶点之间都存在路径相连而组成的一个子图。用一个图来说明,例如,下面这个叫graph的大图里,存在两个连通图。左边是一个连接图,该子图里每个顶点都存在路......
  • C/C++ const关键字 解读
    Thecollocationbetweenconstandoriginalpointerisconfusedtomanypeople.Therearetwousagesofit.Thefirstoneisavariablepointerthatpointsaconstantdata.i.e.constint*p#include<iostream>intmain(){ inta=1,b=2; const......