C++ 顶层 const

C++ 顶层 const

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

我的主力博客:半亩方塘

本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面

1. 顶层 const 与底层 const 概念

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

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

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

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

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

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

int *p = p3;  // 错误:p3 包含底层 const 定义,而 p 没有
p2 = p3;   // 正确:p2 和 p3 都是底层 const
p2 = &i;   // 正确:int* 能转换成 const int*
int &r = ci;  // 错误:普通的 int& 不能绑定到 int 常量上
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&,赋值语句等号右側的类型向左側转换,一般很量能够向很量转换,所以是正确的。

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

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

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


相关推荐

  • linux(4)Linux 文件内容查看「建议收藏」

    linux(4)Linux 文件内容查看「建议收藏」查看文件内容总览cat由第一行开始显示文件内容tac从最后一行开始显示,可以看出tac是cat的倒着写!nl显示的时候,顺道输出行号!more一页一页的显示文件内容less

    2022年7月31日
    6
  • XPS文件转换成PDF[通俗易懂]

    XPS文件转换成PDF[通俗易懂]作者:iamlaosongXPS是XMLPaperSpecification(XML文件规格书)的简称是一种电子文件格式,它是微软公司开发的一种文档保存与查看的规范。同事有一个XPS文件,希望能够转换成PDF格式。方法一:电脑上安装了AdobeAcrobat8Professional1、双击打开AdobeAcrobat8Professional。2、点击“打开”,选择要转换的XPS文件。3、不出意外的话XPS文件可以正常打开并看到内容。4、另存为PDF文件即可。电脑上有其他版.

    2022年6月4日
    44
  • linux ptrace函数

    linux ptrace函数【ptrace系统调用】功能描述:提供父进程观察和控制另一个进程执行的机制,同时提供查询和修改另一进程的核心影像与寄存器的能力。主要用于执行断点调试和系统调用跟踪。父进程可通过调用fork,接着指定所产生的子进程的PTRACE_TRACEME行为,最后使用exec等操作来初始化一个进程跟踪。可替代的做法是,父进程通过PTRACE_ATTACH请求跟踪一个现存进程的执行。当子进程

    2025年6月14日
    2
  • 手机版mt4平台下载下载手机版mt4_手机mt4平台下载安卓

    手机版mt4平台下载下载手机版mt4_手机mt4平台下载安卓MetaTrader4(缩写MT4)是由俄罗斯迈达克软件公司(英文名称MetaQuotesSoftwareCorp)发布的一款交易软件,可同时在电脑端和手机端使用。但是,正版手机端mt4一般要从谷歌商店下载,而GooglePlay的下载地址经常打不开。本人使用mtr软件多年,在使用方面有一些经验,现将2020年版手机mt4下载地址分享给各位网友,愿您交易如索罗斯一般行如流水!mt4下载地址:https://t00y.com/file/29212124-458672692提取码:pj265(

    2022年8月15日
    4
  • java前端好学还是后端好学,一篇文章帮你解答

    java前端好学还是后端好学,一篇文章帮你解答蚂蚁金服一面:下午杭州的电话,问有没有空,果断有空,虽然感觉略显紧张,有点懵逼。面试的题目:HashMap和Hashtable的区别实现一个保证迭代顺序的HashMap说一说排序算法,稳定性,复杂度说一说GC可以保证的实习时长职业规划整体来说,一面的基础性问题比较多,所以博主基本都答出来了,准备过还是有些用处的。所以一面完了感觉还不错,接着第二天下午就二面了。蚂蚁金服二面二面是我最慌的面试,因为二面是最关键的,是最大的主管面试,所以非常关键,整体来说,二面的节奏非常快,和一面完全

    2022年7月9日
    16
  • CSS + HTML导航栏效果

    CSS + HTML导航栏效果今天写了一个导航栏,需要的效果如下:实现的代码思路如下:<!DOCTYPEhtml><htmllang="en"><head> <metacharset="UTF-8"> <title>导航栏</title> <styletype="text/css"

    2022年5月28日
    37

发表回复

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

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