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. 开源DirectShow分析器和解码器: LAV Filter

    LAV Filter 是一款开源的DirectShow视频分离和解码软件,他的分离器LAVSplitter封装了FFMPEG中的libavformat,解码器LAVAudio和LAVVideo则封装了 ...

  2. stdin、stdout、stderr

    1 ferror 2 stdin 3 stdout 4 stderr 1 ferror 功能:检测文件是否出现错误 返值:未出错0,出错非0 说明:每次调用文件输入输出函数,均产生一个新的ferror ...

  3. sqlserver数据库 提纲

    sqlserver数据库一.体系结构文件--服务--界面 文件---.maf .ldf .ndf服务--MSSqlserver,别名(实例名)界面--宋庆龄serve如何windouws身份验证,如何 ...

  4. Android判断网络连接状态

    有的时候我们的应用可能需要判断当前设备是否联网 private void init() { /** 获得系统级联网管理员对象 */ ConnectivityManager manager = (Con ...

  5. D3学习教程

    [ D3.js 入门系列 ] 入门总结 | OUR D3.JS http://www.ourd3js.com/wordpress/?p=396

  6. 2014.12.01 B/S 使用VS建立Web网站

    要求:从hr数据库info表读取数据,在Web网站中显示为如图: 用DW绘制一个表格,然后将代码拷贝到新建的网站主页代码中 <div> <table bgcolor=" w ...

  7. Ubuntu引导修复问题

    Ubuntu和Win7双系统,一不小心在Ubuntu下把Win7 C盘的boot目录给删了(手贱呀),然后Win7就没了,后来找了张WinPE启动盘修复了Win7引导结果,Ubuntu系统的引导没了. ...

  8. Linux(CentOS)安装配置zeromq、jzmq(解决各种问题)

    今天为Hadoop配置zeromq.jzmq遇到各种问题,先是编译出错,到编译成功后测试出错等等,下面将我遇到的问题与大家分享一下. 第一个注意点是:必须先编译安装zeromq,然后在编译jzmq,否 ...

  9. OC-方法

    1.类声明 @interface Person : NSObject { @public int _height; int _weight; int _age; } // 如果你不想每次使用方法都需要 ...

  10. unity3d实现Socket

    首先创建一个服务器 using UnityEngine; using System.Collections; using System.Net.Sockets; using System.Net; u ...