C++中顶层const和底层const

C++中顶层const和底层const

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

1. 顶层 const 与底层 const 概念

 指针本身是一个对象,由于,指针实际相应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个全然不同的概念, 顶层 const 表示的是 指针本身是一个常量, 底层 const 表示的是 指针所指的对象是一个常量,更普通情况下, 顶层 const 能够表示随意对象是一个常量,这对于算术类型、类、指针等不论什么数据类型都是成立的, 底层 const 则与指针和引用等复合类型的基本类型部分有关 ,比較特殊的是,指针既能够是顶层 const 也能够是底层 const ,这一点与其它类型差别明显。

2. 顶层 const 与底层 const 在运行拷贝操作时的不同

对于顶层 const 与底层 const ,在运行对象拷贝时有着明显的不同:

(1)顶层 const 不受什么影响

  1. int i = 0;  
  2. const int ci = 42;   // 不能改变 ci 的值,这是一个顶层 const  
  3. i = ci;   // 正确:ci 是一个顶层 const,对此操作无影响  
  4. const int *p2 = &ci;  // 同意改变 p2 的值,这是一个底层 const  
  5. const int *const p3 = p2;  // 靠右的 const 是顶层 const ,靠左的是底层 const  
  6. p2 = p3;   // 正确:p2 和 p3 指向的对象的类型同样,p3 顶层 const 的部分不影响  

(2)底层 const 的限制不能忽略, 
要求拷出和拷入的对象有同样的底层 const 资格或者能转换为同样的数据类型,一般很量可以向常量转换,反之则不行

  1. int *p = p3;  // 错误:p3 包含底层 const 定义,而 p 没有  
  2. p2 = p3;   // 正确:p2 和 p3 都是底层 const  
  3. p2 = &i;   // 正确:int* 能转换成 const int*  
  4. int &r = ci;  // 错误:普通的 int& 不能绑定到 int 常量上  
  5. const int &r2 = i;  // 正确:const int& 能够绑定到一个普通 int 上  

来分析一下以上的代码:

int *p = p3;
p3 既是一个顶层 const 又是一个底层 const,在运行对象拷贝时,顶层 const 部分没有不论什么影响,全然不用考虑,可是 p3 又是一个底层 const ,它要求拷入的对象有同样的底层 const 资格,而 p 没有,所以是错的;

p2 = p3;
p3 要求拷入的对象拥有同样的底层 const 资格,p2 也是一个底层 const,故正确;

p2 = &i;
对 i 取地址将得到 int*, p2 是 const int*,前者是很量,后者是常量,赋值语句等号右側的类型向左側转换,很量可以向常量转换,故正确;

int &r = ci;
由左側部分我们知道,须要得到的是一个绑定到 ci 上的引用,而绑定到 ci 上的引用的类型是 const int&,等号左側的类型是 int&,赋值语句等号右側的类型向左側转换,可是常量不能向很量转换,所以是错误的;

const int &r2 = i;
由左側部分我们知道,须要得到的是一个绑定到 i 上的引用,而绑定到 i 上的引用的类型是 int&,等号左側的类型是 const int&,赋值语句等号右側的类型向左側转换,一般很量能够向很量转换,所以是正确的。

不仅要注意类型转换的限制 同一时候须要考虑const的性质

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118586.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm多行代码同时注释、去除注释_pycharm取消注释快捷键

    pycharm多行代码同时注释、去除注释_pycharm取消注释快捷键单多行注释就一个组合键:选中+Ctrl+/

    2022年8月25日
    7
  • maven的热部署

    maven的热部署在tomcat中配置用户权限,即添加管理员帐号 在根目录/conf/tomcat-users.xml 里添加下面的代码 <rolerolename="manager-gui"/><rolerolename="manager-script"/><userusername="admin"password="admin"roles="mana

    2022年5月18日
    38
  • Java程序员必看的 14 本 Java 书籍![通俗易懂]

    Java程序员必看的 14 本 Java 书籍![通俗易懂]关乎于程序员,除了做项目来提高自身的技术,还有一种提升自己的专业技能就是:多!看!书!毕竟,书是学习的海洋呢!So,Java程序员你们准备好了吗?双手奉上Java程序员必读之热门书单。在下面这13本书籍中小编还是要建议大家可以先去关注英文原版,毕竟翻译的书籍中都有一定的语法错误。 入门 《HeadFirstJava》作者:KathySierra/…

    2022年7月7日
    120
  • MyBatisCodeHepler 激活码-激活码分享

    (MyBatisCodeHepler 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
    49
  • Word域的应用和详解

    Word域的应用和详解本文主要内容:域基础通用域开关表格操作符和函数编号域  ■第一章域基础一、域的作用  微软的文字处理软件MicrosoftWord系列,其方便和自动化程度是其他任何文字处理软件所望尘莫及的。究其原因,其一,微软有强大的软件开发技术人员队

    2022年6月12日
    45
  • 深度图像基础知识(一)[通俗易懂]

    深度图像基础知识(一)[通俗易懂]深度图像(depthimage)也被称为距离影像(rangeimage),是指将从图像采集器到场景中各点的距离(深度)作为像素值的图像,它直接反映了景物可见表面的几何形状。深度图像经过坐标转换可以计算为点云数据,有规则及必要信息的点云数据也可以反算为深度图像数据。深度数据流所提供的图像帧中,每一个像素点代表的是在深度感应器的视野中,该特定的(x,y)坐标处物体到离摄像头平面最近的

    2022年4月25日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号