我的主力博客:半亩方塘

本文的主要參考来源来自于: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 的值,这是一个顶层 const
i = ci; // 正确:ci 是一个顶层 const,对此操作无影响
const int *p2 = &ci; // 同意改变 p2 的值,这是一个底层 const
const int *const p3 = p2; // 靠右的 const 是顶层 const ,靠左的是底层 const
p2 = 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&
,赋值语句等号右側的类型向左側转换,一般很量能够向很量转换,所以是正确的。

C++ 顶层 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和底层const

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

  3. 顶层const

    顶层const:指针本身是一个常量 底层const:指针所指对象是一个常量 顶层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. devStack

    1,devstack shell 脚本开源官网 http://devstack.org/ 脚本功能快速搭建 OpenStack 的运行和开发环境 [Note tips by Ruiy devstack ...

  2. Unity 生命周期

    原文翻译:            Execution Order of Event Functions            事件函数的执行顺序                        Edit ...

  3. 委托、Lambda表达式

    本文来自:http://wenku.baidu.com/link?url=o9Xacr4tYocCPhivayRQXfIc9kOZeWBwPn2FZfeF19P4-8YX5CMXs74WB-Y8t0S ...

  4. 安装mysql时出错。无法初始化。 libstdc++.so.5

    ./bin/mysqld: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: ...

  5. android——fragment长时间home或者锁屏java.lang.IllegalArgumentException:No view found for id for....

    在项目中遇到了这个问题.头痛了很久,总是无法重现,也不能很好的解决.总是在息屏后一段时间,就会报java.lang.IllegalArgumentException:No view found for ...

  6. Javascript进阶篇——( JavaScript内置对象---上-Date,string,charAt,indexOf,split,substring,substr)笔记整理

    什么是对象JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法.对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等:对象的方法:能够在 ...

  7. 如何安装chrome扩展,以json-handle

    读取本地json文件 chrome插件安装 方式一,在线安装 直接插到json-handle地址,添加即可 https://chrome.google.com/webstore/detail/json ...

  8. Information seeking letter, hard copy version

    23 Roanoke Street Blacksburg, VA 24060 (540) 555-1123 K.Walker@vt.edu October 23, 20XY Mr. James G. ...

  9. VMVare虚拟机的异常处理---内部错误

    由于昨天晚上关闭虚机时手快,直接把机器睡眠了.今天早上开机后,虚机显示启动状态,但是无法连接.搜了一下,网上说删掉.lk锁文件就可以了,删掉后,没有反应,强制关闭,再次启动VM,还是打不开,显示内部错 ...

  10. iOS学习笔记-死锁deadlock理解

    1.首先看一下官方文档的解释,这个block的队列是同步执行的,不像异步,这个方法直到block执行完毕才会返回 2.主线程一旦开启,就要先把自己的代码执行完成之后,才去执行加入到主队列中的任务 De ...