我的主力博客:半亩方塘

本文的主要參考来源来自于: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. What is NicEdit?

    NicEdit - WYSIWYG Content Editor, Inline Rich Text Application   What is NicEdit? NicEdit is a Light ...

  2. Eclipse 快捷键总结

    导包:alt+/ctrl+shift+o (alt+/) 全局文件搜索:ctrl+shift+r 全局关键词搜索:ctrl+h 查看解决方案:ctrl+1 自动补全:abcdefghjklmnopqr ...

  3. 网站SEO优化中内部链接的优化

    重要性:内链有效的优化能够间接的提高某页面的权重达到搜索排名靠前的效果.同时有效的带领搜索引擎蜘蛛对整站进行抓取. 网站头部导航: 这个导航称为'网站主导航',当用户来到网站需要给他们看到的内容.也就 ...

  4. Google Go 语言从入门到应用必备开源项目

    Go 语言于 2009 年 11 月正式宣布推出,成为开放源代码项目,发展至今已经具有越来越广泛的影响力,今年更是在 TIOBE 编程语言排行榜中跻身 20 强.很多开发者也逐渐将目光投向这门语言,本 ...

  5. Ice_cream's world I

    Ice_cream's world I Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) ...

  6. 水池数目(DFS)

    水池数目 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地 ...

  7. 把Storyboard减轻的方法

    把Storyboard减轻的方法 by 伍雪颖 UIViewController *secondStoryboard = [[UIStoryboard storyboardWithName:@&quo ...

  8. js执行环境深入研究

    js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈) 当为全局函数时,如: ...

  9. 安装weblogic的步骤10.3.0.0

    一.安装前的注意事项: weblogic在安装前必须要有对应的jdk支持weblogic的运行.所以在安装之前一定要根据本机上安装的jdk来选择安装的weblgoic的什么版本.因为weblogic的 ...

  10. 移动端-弹窗demo

    <!doctype html> <html> <head> <meta charset="UTF-8"> <meta name ...