顶层const:指针本身是一个常量

底层const:指针所指对象是一个常量

  • 顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型、类、指针等
  • 底层const则与指针和引用等复合型的基本类型部分有关

指针类型既可以是顶层const也可以是底层const,这一点和其他类型相比区别明显:

int i = ;
int *const p1 = &i;//不能改变p1的值,顶层const
const int ci = ;//不能改变ci的值,顶层const
const int *p2 = &ci;//允许改变p2的值,这是一个底层const
const int *const p3 = p2;//靠右的const是顶层const,靠左的是底层const
const int &r = ci;//用于声明引用的const都是底层const

当执行对象的拷贝操作时,顶层对象不受影响:

i = ci;//正确:拷贝ci的值,ci是一个顶层const,对此操作毫无影响
p2 = p3;//正确:p2和p3指向的对象类型相同,p3顶层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上

p3即是一个顶层const也是底层const,拷贝p3可以不在乎它是一个顶层const,但是必须清楚它指向的对象也是一个常量,因此不能用p3去初始化p,因为p指向是一个普通的(非常量)整数。

p3的值可以赋给p2,因为两个指针都是底层const。尽管p3也是一个常量指针,仅就这次赋值而言不会由什么影响。

顶层const的更多相关文章

  1. 第2章 变量和基本类型 附3---底层const和顶层const

    和英文版的对: As we’ve seen, a pointer is an object that can point to a different object. As a result,we c ...

  2. C++ 顶层 const

    我的主力博客:半亩方塘 本文的主要參考来源来自于:C++ Primer 中文版(第 5 版) 第 57 面至第 58 面 1. 顶层 const 与底层 const 概念 我们知道,指针本身是一个对象 ...

  3. C++中顶层const和底层const

    1. 顶层 const 与底层 const 概念 指针本身是一个对象,由于,指针实际相应着内存单元的一段存储空间,然而,指针所指向的也是一个数据对象,因此,指针是一个常量与指针所指向的是一个常量是两个 ...

  4. C++之const限定符(顶层const,底层const)

    作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7050815.html C++之const限定符(顶层const,底层cons ...

  5. c++ 顶层const与底层const

    底层const是代表对象本身是一个常量(不可改变):      顶层const是代表指针的值是一个常量,而指针的值(即对象的地址)的内容可以改变(指向的不可改变): #include <iost ...

  6. c++ primer 中讲的顶层const 和 底层 const 理解

    c++ primer 中讲的    顶层const 和 底层 const   以前没搞懂的顶层const和底层const,这次看了后感觉明白了. 首先,const是一个限定符,被它修饰的变量的值不能改 ...

  7. 顶层const和底层const

    As we’ve seen, a pointer is an object that can point to a different object. As a result,we can talk ...

  8. this指针、引用、顶层和底层const关系

    1.首先顶层const和底层const是围绕指针*p的说法.底层:const int *p,const不是修饰指针p,指针所指的值不能改变:顶层:int *const p,const修饰指针p,指针本 ...

  9. C++ const用法总结

    1 const分顶层const,底层const2 顶层const可以表示任意类型的对象是常量.eg:     const int i:i是一个整型常量    int *const ccc:ccc是指向 ...

随机推荐

  1. JS学习笔记Day1

    一.JS概述 1.什么是JS? 是一种基于对象和事件驱动的客户端脚本语言: 运行环境:浏览器(通过浏览器解释执行) 2.JS产生于哪一年,哪个公司,是谁?第一个名字是什么? 1995年,网景公司.布兰 ...

  2. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  3. 剑指Offer_编程题_7

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 class Solution { public: int Fibonacci(int n) ...

  4. java 中+的运算规则

    1.Java中的加法的运算优先级是从左往右的 2.字符串""隔壁跟的+号意思是字符串的连接 就不是加法了 3.'字符' 后面的+号意思是'字符'的ascall码值和后面的值相加 c ...

  5. python--编写用例脚本

    from appium import webdriverimport time desired_caps = {}desired_caps['platformName'] = 'Android'des ...

  6. 如何在Ubuntu上开启SSH服务

    更新源列表 打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"-- ...

  7. zepto.js

    // Zepto.js// (c) 2010-2016 Thomas Fuchs// Zepto.js may be freely distributed under the MIT license. ...

  8. 【1】Java中double转BigDecimal的注意事项

    项目遇到该问题 先上结论:不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这 ...

  9. 很好的sql多表

    oracle 多表联合查询总结归纳 2018年08月16日 20:57:39 阅读数:44905 本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: ...

  10. [Android] Android RecycleView和ListView 自定义Adapter封装类

    在网上查看了很多对应 Android RecycleView和ListView 自定义Adapter封装类 的文章,主要存在几个问题: 一).网上代码一大抄,复制来复制去,大部分都运行不起来,或者 格 ...