前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++100问】深入理解理解顶层const和底层cons

【C++100问】深入理解理解顶层const和底层cons

作者头像
我是管小亮
发布2020-04-20 16:09:01
1.7K0
发布2020-04-20 16:09:01
举报

1、顶层const和底层const对比

《C++primer》中写到:

  • 顶层 const 表示指针本身是个常量;
  • 底层 const 表示指针所指的对象是一个常量。

指针类型既可以是顶层 const 也可以是底层 const

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

即(除了 const int ci = 42; //顶层const):

  • 如果 const 右结合修饰的为 类型 或者 *,那这个 const 就是一个底层 const
  • 如果 const 右结合修饰的为 标识符,那这个 const 就是一个顶层 const

非官方定义,用来记忆为主。


不过个人感觉更好的理解还是 stackoverflow——What are top-level const qualifiers? 上的,总结来说:

  • 被修饰的变量本身无法改变的 const 是顶层 const
  • 通过指针或引用等间接途径来限制目标内容不可变的 const 是底层 const

给了两个例子:

// 底层constchar x;char const* p = &x;
// 顶层constchar x = 't';char *const p = &x;

当然还有轮子大神的解释 知乎——顶层const与底层const。C++的对象中的对象究竟是指?:

我的理解是 const 的位置很重要,即 const intint const 的区别非常重要,不过我还不能完全理解这其中的区别,可能学完能有一个新的认识吧。。。fighting!


小结一下: 主要的理解问题基本可以得到解决,认识哪一个是什么即可,这一点上 stackoverflow 显然更清晰,除此之外,最大的问题应该是中文对于底层 const 的翻译,英文原文的两个单词是:

  • top-level const 顶层 const
  • low-level const 底层 const

对的,你没看错,是 low 而不是 bottom。。。所以或许成为低层更恰当???

2、顶层const和底层const区别

当执行拷贝操作时,常量是顶层 const 还是底层 const 的区别就非常明显了:

  • 顶层 const 没有影响。拷贝操作不会改变被拷贝对象的值,因此拷入和拷出的对象是否是常量无关紧要。
i = ci;     			// ok: 拷贝ci的值,ci是一个顶层const,对此操作无影响p2 = p3;    			// ok: p2和p3指向的对象类型相同,p3顶层const的部分不影响
  • 底层 const 的限制不能忽视。拷入和拷出的对象必须具有相同的底层 const 资格,或者两个对象的数据类型可以相互转换(一般来说,非常量可以转换成常量,反之则不行)。
int *p = p3;        // error: p3包含底层const的定义,而p没有p2 = p3;            // ok: p2和p3都是底层constp2 = &i;            // ok: int*能转换成const int*int &r = ci;        // error: 普通的int&不能绑定到int常量上const int &r2 = i;    // ok: const int&可以绑定到一个普通int上

3、剥洋葱

最后举一个例子,证明【剥洋葱】,从右向左看更容易理解:

const int *p // p是指针,指向int,int是const, 「*p」类型为int并且不可变;是低层const;int *const p // p是const,是常量指针,指向int, p属于「int *」并且不可变;是顶层const;

参考文章

  • https://www.zhihu.com/question/24785843
  • 《C++ Primer》学习笔记(二):变量和基本类型
  • 《C++ Primer》习题参考答案:第2章 - 变量和基本类型
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员管小亮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档