首先看下定义

顶层const是指   const修饰的是指针,即此指针是常量指针,一旦指向某个对象,则不能指向其他对象

底层const是指  const修饰的是指针所指向的对象为常量,不能通过指针去修改对象的值

const int *pa;//底层const
int a;
int *const pb=&a; //顶层const,需要定义时初始化

以下则是C++ Prime英文版的解释
2.4.3.Top-Level const

As we’ve seen, a pointer is an object that can point to a different object. As a result,
we can talk independently about whether a pointer is const and whether the objects
to which it can point are const. We use the term top-level const to indicate that the
pointer itself is a const. When a pointer can point to a const object, we refer to
that const as a low-level const.

关于顶层const和底层const,需要注意的一点就是在作为函数参数时的区别,函数中形参的顶层const会被忽视,从而可能产生以下的编译错误。

void fun(int *p){  //一切最简单化}void fun(int *const p){  //顶层const会被忽视,从而导致函数重复定义}

1>: error C2084: 函数“void fun(int *const )”已有主体
1>    : 参见“fun”的前一个定义
========== 生成:  成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
由于编译器检测形参的类型,所以两个fun函数都是int *类型的形参,所以编译器会认为函数重复定义

而c++ Prime中关于const 形参和实参章节,使用了以下的例子

void fun(int i){ }void fun(const int  i){ }

编译器同样也出现了上面的函数重复定义错误

然而我们会发现这个例子中的const并不是顶层const 和底层const的范畴,关于定义可以详细阅读上面的英文定义。

但是我们可以这样理解,如果const修饰的直接对象是无法修改的,那么在作为形参时,将会忽视掉这个const,上面例子中的变量i 就是可以这么理解,无法修改i 的值,顶层const也是直接修饰的是指针对象,如第一个例子,指针p是无法修改值的。

所以我们在使用const修饰的变量作为形参时,只要遵循上面的定律,看const直接修饰的对象能否修改,来判断是否会出现以上的错误。

还有一小点,如果const直接修饰的对象不能修改,那么给它传常量对象或非常量对象都是可以的,这也印证了“顶层”const会被忽视。

【c++】c++中顶层const与底层const相关推荐

  1. char类型的实参与const char类型的形参不兼容_C++干货系列——顶层const和底层const...

    顶层 const 和底层 const 学C++的小伙伴是不是被const机制搞得晕头转向,永远都记不住哪个是指针不能变哪个是指针指向的对象不能变?纯靠记忆肯定不行,理解透彻才能一劳永逸.本文详细介绍了 ...

  2. C++ Primer笔记——顶层const和底层const区别

    顶层const和底层const的区别 书中的定义: 顶层const(top-level const):表示指针本身是个常量. 底层const(low-level const):表示指针所指的对象是一个 ...

  3. 顶层const和底层const的含义和区别

    首先,顶层const和底层const都是相当于指针而言的,比如说const int a,这个const既不是顶层也不是底层,因为a不是指针. 其次,如何看const是修饰的什么呢. 原则是谁在cons ...

  4. 顶层const和底层const

    auto 会去掉引用,去掉顶层const,这块知识又重新看了一下. 首先要知道,顶层和底层const只有指针类型才有, 先看一下普通类型 const 常量,初始化之后就不可变. const int a ...

  5. 1.C和C++区别,以及const分析(底层const/顶层const)

    从本章起开始从0学习C++,本章主要内容: 1)C和C++的基本区别 2)C和C++的const区别 1.C++和C区别 1.1 C++更强调语言的实用性,所有变量都可以在需要时再定义 比如: for ...

  6. C++ auto与顶层const和底层const的关系

    auto是C++11标准推出的用于依据初始化表达式来推断变量类型的关键字. 与decltype不同,auto推断的时候,一般会忽略掉顶层const: 比如 // 目标是const int const ...

  7. 顶层const和底层const的区别

    指当指针指向一个对象时,若指针本身为常量,则为顶层const:如果const是指指针指向的对象不可改变,指针本身可以改变,则叫做底层const

  8. 顶层const与底层const

    指针本身是一个对象,它又可以指向另外一个对象.因此,指针本身是不是常量以及指针所指的是不是一个常量就是两个相互独立的问题. 用名词顶层const(top-level const)表示指针本身是个常量, ...

  9. int const *和int * const以及const int * const的区别

    int const *是一个指向常量整数的指针 指向了一个不能被修改的值但是指针指向的地址可以改变 const在数据类型的一侧,所以可以放在int的前面const int *,(从c++ prime了 ...

最新文章

  1. java 去掉 时期中的图片,去除图片浅色背景(Java 实现)
  2. 使用Win API创建工具栏
  3. Apache OpenMeetings 5.0.0 发布:开源视频会议和协作系统
  4. LeetCode 705. Design HashSet (设计哈希集合)
  5. c 子类对象 访问父类对象受保护成员_看了这个,你就会搞对象了
  6. 听说你还不理解JavaScript闭包
  7. 黑客工具之NBSI介绍
  8. echarts写地图,调用本地地图json数据,实现秒下钻功能
  9. 传输层常见的协议及端口
  10. 品牌故事对于品牌发展的重要性
  11. kali linux 2020.4 自带浏览器英文改中文
  12. 从零开始Kubernetes CronJob实现任务调度
  13. bootstrap, boosting, bagging
  14. oa系统服务器什么意思,OA系统是什么意思
  15. 单元格内容分列多行_『如何将excel单个表格里的多行数据分列』
  16. 修改MySQL数据库密码的多种方法
  17. 初学Linux RHEL时遇到的系列问题和解决方案
  18. 图书馆炭火盆旁边的数学遐想
  19. 数据结构(使用头插法实现单链表)
  20. NTLDR is missing和NTLDR is compressed的解决办法

热门文章

  1. LSF - 提交GUI应用到LSF无法运行,报错Failed to connect to socket /tmp/dbus-xxxxxxxxx: Connection refused
  2. Bootstrap 颜色RGB对照表
  3. python实现账号密码登录
  4. spreadsheet php,PhpSpreadsheet的简单使用
  5. (原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)
  6. 基于matlab的2psk功率,基于matlab的相移键控系统仿真.doc
  7. 逸管家诚信是企业的立业之本
  8. Jenkins用户权限控制插件——Role-based Authorization Strategy
  9. [跟进]_会议“诊断腾讯”
  10. Spring JPA 随手记