看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解
extern const int ci =42;
const int * p2 = &ci;
extern const int *const p3= p2;
int *p= p3; //错,p没有底层const。
书上的解释是: p3是顶层const 也是底层const,拷贝p3可以不在乎其顶层const, 但是p3指向的是一个常量,因此不能用P3初始化p, 而p 只能指向非常量。 理解他说的意思是因为一个指向常量一个指向非常量。
但自己仔细想想, 底层const也可以指向一个非常量, 那是不是当p3一开始就用非常量初始化时,此时p3和p 都指向非常量了, int *p= p3; 是不是就正确了呢? 如果按书上的解释,给人的误解是当他俩都指向常量或非常量时就没问题了, 这是误解,产生误解是因为他没说清楚。
我是这么理解: 指向常量的指针既可以指向常量 也可以指向非常量, 而一般普通指针只能指向非常量。
1、假设 不同时具有底层const也可以拷贝:
当有底层const的指针给 没有底层const的指针赋值时, 因为 前者可以指向常量或非常量,后者只能指向非常量, 所以前者无关紧要。感觉没啥不对的。
现在反过来:
当没有底层const的指针 给 有底层const的指针 赋值时, 因为前者只能指向非常量, 后者可以指向常量或非常量,问题来了: 当后者指向非常量,都只需非常量了,至于能不能改变所指对象值,这是二者自身的语法规定问题,不相关; 但是当后者指向的是常量时, 因为前者只能指向非常量,
那把对象的地址赋值给你了,缺不能指向常量,这就矛盾了。 所以,因为在此时情况下不能同时满足双方语法规则。
所以干脆就规定赋值时二者必须具有底层const。 这样就规避了这种情况。 不管是不是这个原因这么规定的, 但是可以这么理解这个规定。
2、 或者我们这么理解: 指针int * 必须指向类型匹配的对象, 而指向常量的指针是const int * , 类型不匹配,所以不能拷贝, 也不能初始化。常量指针可以理解为值不变的指针
3、 或者这么理解也可以: 非常量可以转换为常量, 常量不可转换为非常量: int * 可以转换为 const int *, 反之不行。
不知道上面的三种理解是不是正确, 请理解真正原因的大神解疑答惑啊。
看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解的更多相关文章
- c++ primer 中讲的顶层const 和 底层 const 理解
c++ primer 中讲的 顶层const 和 底层 const 以前没搞懂的顶层const和底层const,这次看了后感觉明白了. 首先,const是一个限定符,被它修饰的变量的值不能改 ...
- 【C++ Primer | 15】构造函数与拷贝控制
合成拷贝控制与继承 #include <iostream> using namespace std; class Base { public: Base() { cout << ...
- c/c++ 拷贝控制 右值与const引用
拷贝控制 右值与const引用 背景:当一个函数的返回值是自定义类型时,调用侧用什么类型接收?? 1,如果自定义类型的拷贝构造函数的参数用const修饰了:可以用下面的方式接收. Test t2 = ...
- ASP.NET#使用母版时,如果要使用js中的getElementById()方法取得某个内容页的元素时要注意的问题
当使用母版,要使用js中的getElementById()方法取得某个内容页的元素时,所选取的id并不是母版中内容页的id,而是在设计内容页时设定的id例子:母版页: ...... <head ...
- msxml3.dll 执行页内操作时的错误
msxml3.dll 执行页内操作时的错误 regsvr32 msxml3.dll报错
- 请求通道在等待 00:00:58.9616639 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能是更长超时的一部分。
异常信息:请求通道在等待 00:00:58.9616639 以后答复时超时.增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值.分配给此操作的时间可能是更长超时的一部分. 开发背 ...
- Linux - 几种方法来实现scp拷贝时无需输入密码
前言 在实际工作中,经常会将本地的一些文件传送到远程的机器上.scp是一个很好用的命令,缺点是需要手工输入密码. 如何在shell脚本中实现传输文件,而不用手工输入密码呢?接下来介绍三种方法. 一.建 ...
- BeanUtils.copyProperties()拷贝属性时,忽略空值
把source的属性值复制给target的相同属性上,注意:双方需要复制的属性要有get.set方法 BeanUtils.copyProperties(source, target, PublicUt ...
- 转载:看c++ primer 学习心得
学习C++ Primer时遇到的问题及解释 chenm91 感觉: l 啰嗦有时会掩盖主题:这本书确实有些啰嗦,比如在讲函数重载的时候,讲了太长一大段(有两节是打了*号的,看还是不看 ...
随机推荐
- resample matlab实现
使用线性插值实现sample rate转换. function output = simpleResample(input, inputfs, outputfs) inputLen = length( ...
- HTTP状态码详解【转】
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- Unable to connect to a repository at URL
缓存问题: 1. 右键点击本地副本,TortoiseSVN -> Settings -> Saved Data, 2.点击“Clear”按钮,把本地缓存都清除了,点击“确定”: 3. 再重 ...
- qq自己设定动态图像视屏
类似于样但是是自己定义的视屏先上壁纸 这个具体是怎么制作的呢? 先从网络上下载自己喜欢的mp4视屏 qq头像上面点击拍摄动态图像 先随意拍摄2秒保持拍摄完成的状态不要点击确定 然后用手机文件夹找到你要 ...
- Java之字符串替换replace()
replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的 import java.uti ...
- 状态压缩DP入门题
. /*本题为状态压缩题 题目大意 : 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧, 可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方 格不能同时放牛(不包括斜着的 ...
- egg.js 配置cors跨域
1.egg简述 Egg.js,为企业级框架和应用而生,是阿里开源的企业级 Node.js 框架. 2.特点 Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开 ...
- 题解【POJ1160】Post Office
[POJ1160]Post Office Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 22362 Accepted: 1208 ...
- dbGet
dbGet是Innovus/Encounter DBTCL命令的一种.除了dbGet,DBTCL的命令还包括以下几种: 1. dbSet 2. setDbGetMode/getDbGetMode 3. ...
- Spark学习笔记1
趁着工作业余时间,趁着内心对技术追求的热情,还是对Spark这个大数据内存计算框架动手了,毕竟人与人之间的差距都是在工作业余时间拉开的…… Spark官网:http://spark.apache.or ...