C++中
Const修饰的量叫常量,与普通变量的区别是什么?
C++中有两点1:编译方式不同,在编译的过程中,所有在程序中出现名字的地方都会被初值替换掉 2:不能作为左值了

const 修饰的量常出现的使用错误有:
1:常量作为左值修改值 (因为这种方式可以直接修改常量的值)
2:把常量的地址泄漏给一个普通的指针或普通的引用变量 (因为这种方式可以间接修改常量的值如下示例1代码)
示例1:
const int a=10;
int p =&a; //p=20; 编译报错 不能将 const int*(整型常量的地址) 赋值给 int *(普通的int指针)

const 和一级指针结合方式有如下种类
C++的语言规范: const修饰的是离他最近的类型

const int *p;
p指针指向的内容不能再被修改,但是p可以指向任意的int类型的内存

int const *p;
这种方式同上

int * const p;
const 修饰的类型是 int *,修饰的表达式是p, 即 p的值(也是地址)不能被修改了,即p不能再指向其他内存地址了,但是p所指向的那个内存的值得内容可以修改 即 *p=200;

cont int * const p;
const p 是指 p不能再指向其他内存地址了, const int * 是指 p指向的内容不能在修改了.

示例2:如下
const int b=10;
const int * p=&b;(OK 编译通过)
int *pp=&b (NOT OK, 相当于将 const int * 转为 int *)

int c=10;
int *p1=&c; (OK)
const int *p2=&c; *(OK 相当于将 int * 转为 const int )
int * const p3=&c; (OK)


int * p=nullptr;
int * const p1=nullptr;
cout<<typeid(p)<<endl; // 结果是 int *
cout<<typeid(p1)<<endl;// 结果是 int *
**结论:如果const 右侧没有指针即没有*的话,那const不参与类型, 即 int * const p1, 这个const 不参与类型, p1的类型仍然是 int * 见下面代码
所以示例3:
int c=10;
int * const p3 = &c; (OK, int * 转为 int * const 根据上面的结论 const 不参与类型, 其实还是 int * 转为 int *)


示例4:
int x=100;
const int *p=&x;
int *p1=p; // 错误 相当于 const int * 转为 int * 是不可以的


const和二级指针的结合

const 与二级指针的结合分成以下几种
const int ** p
根据C++编程规范,const 修饰离他最近的类型, const 修饰的类型是int ,修饰的表达式是 **p , 是指 **p的值不能被修改

int * const * p
const 修饰的类型是 int*, 修饰的表达式是 *p , 指 *p 的值不能被修改, p的值可以修改 **p 的值也可以修改

int ** const p;
const 修饰的类型是 int** , 修饰的表达式是p ,指p的值不能被修改, *p的值可以修改,**p的值也可以修改

看以下示例是否能通过编译
示例5:
int a =10;
int *p =&a;
const int ** q =&p; (这句话无法通过编译)
上面一行代码相当于 int ** 转成 const int **
怎么理解呢?
如果
int a=10;
int *p=&a;
const int ** q =&p;
上面的代码可以编译通过

首先 q 和p指向的是同一块内存地址
如果有
const int b=200;
q =&b;
上面这两行代码,b是const int常量, 现在我们将b的地址放入
q中,即
q=&b,
由于*q和p是同一块内存地址,那么我们是不是就把一个常量的地址即b的地址,就暴露给了一个普通指针p呢?
这将会造成通过普通指针p很容易修改常量b的值了,所以const int ** q = &p; 是不可以的。那么怎么解决呢?
第一种办法:
直接把int *p 加上const不就可以了吗?不就限制了p修改常量的值了吗?
第二种办法:
int a=10;
int *p=&a
const int * const *q=&p;
我就不允许 *q =&b, 不就堵住了把一个常量的地址放入普通指针的口了吗?


示例6:
int a =10;
const int *p =&a;
int ** q =&p; (这句话无法通过编译)
上面一行代码相当于 const int ** 转成 int ** 更加不可以了
如何理解?
const int *p =&a 相当于一级指针P已经做承诺,我指向的内容是不可变的,通过p,是不允许修改指向值得内容的
那么 int ** q =&p ,如果可以通过编译的话,那么我可以 **q 去修改a的值了,那不是让 一级指针的const修饰了个寂寞吗?

同理
int **q = int * const *p 可以转吗?

int * const *p const 修饰的类型是int *,修饰的表达式是 *p,是指 p所指向的内容是不允许修改的,
如果上面的转换可以,那么 **q 是不是可以轻易修改 最底层的值了呢?打破了上面的 的限制,所以结论是不可以的

int *const *q =int ** 可以转吗?

int * const *q 只是表达了 *q 的值是不能修改了而且,所以可以转

原文地址:http://www.cnblogs.com/erichome/p/16835257.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性