1. 顶层 const 与底层 const 概念

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

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

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

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

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

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

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

不仅要注意类型转换的限制 同一时候须要考虑const的性质

C++中顶层const和底层const的更多相关文章

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

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

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

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

  3. 顶层const和底层const

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

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

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

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

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

  6. JavaScript学习系列5 ---ES6中的var, let 和const

    我们都知道JavaScript中的var,在本系列的 JavaScript学习系列2一JavaScript中的变量作用域 中,我们详细阐述了var声明的变量的作用域 文章中提到,JavaScript中 ...

  7. 看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解

    extern const  int ci =42; const int * p2  = &ci; extern const  int *const p3= p2; int *p= p3;   ...

  8. c++中的const参数,const变量,const指针,const对象,以及const成员函数

    const 是constant 的缩写,“恒定不变”的意思.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性.所以很多C++程序设计书籍建议:“Use const whe ...

  9. C++中加const与不加const的区别

    “常量”与“只读变量”的区别. 常量肯定是只读的,例如5, "abc",等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它. “只读变量”则是在内存中 ...

随机推荐

  1. Oracle EBS-SQL (WIP-15):检查车间任务物料未发数量与现有量对照.sql

    select we.wip_entity_name                          任务号      ,mfg_lookups_wjs.meaning               作 ...

  2. umdh工具使用

    先安装工具,http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 选择其中的http://msdn.microsoft.com/ ...

  3. javascript 汉字拼音排序

    定义和用法 用本地特定的顺序来比较两个字符串. 语法 stringObject.localeCompare(target) 参数 描述 target 要以本地特定的顺序与 stringObject 进 ...

  4. LInux 下安装jdk

    安装jdk版本为1.6.0_12 一.下载jdk 下载地址:http://download.java.net/jdk6/ 选择Linux Platform jdk-6u12-linux-i586.bi ...

  5. javaEE servlet获取jsp内置对象

    既然jsp和servlet是等价的,在jsp中能够使用内置对象,那么在servlet中也能够使用. 1.获得out对象 能够使用例如以下代码获得out对象: import java.io.PrintW ...

  6. Android读写JSON格式的数据之JsonWriter和JsonReader

    近期的好几个月都没有搞Android编程了,逐渐的都忘却了一些东西.近期打算找一份Android的工作,要继续拾起曾经的东西.公司月初搬家之后就一直没有网络,直到今日公司才有网络接入,各部门才開始办公 ...

  7. Freedur为什么会免费?

    难道没人看看他们的官方站点吗? Freedur倒闭了...... 一个中国人,Chris Lee,作为Freedur的会计师,窃取了公司的银行帐号.并将Freedur的官方站点指向自己的空间.而且声称 ...

  8. collectionView关于点击事件

    -(void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)i ...

  9. wamp 虚拟目录的设置(转载)

    现在先来配置虚拟主机:1.先打开apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#!!2.打开apache的apach ...

  10. -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory

    刚刚学习SHELL 写了一个简单的例子发生如下错误 -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory ...