const关键字进阶
来源:互联网 发布:java学生成绩录入 编辑:程序博客网 时间:2024/06/06 06:38
C/C++中const关键字用来表示其修饰的某个符号不能够被赋值,也就是说它的值对于这个符号来说是只读的,但是它并不能防止被程序内部的其他方法对该值的修改。也就是说const并不能把变量变成常量:
#include <iostream>using namespace std;int main(){ char *cp = new char[15]; const char *ccp; ccp = cp;//以后ccp不能进行被赋值操作 ccp[0] = 'a'; //编译器会报错 cp[0] = 'a';//程序中利用其他方法对ccp指向的内容进行修改是允许的 ccp = new char[16];//其中const还允许对其进行内容的重新指向 return 0; }
由const引发的参数与原型不匹配问题:
如:
//编译通过foo1(const char*p){}main(int argc, char *argv){ foo1(arvg);}
//编译不通过foo2(const char**p){}main(int argc, char **argv){ foo2(arvg);//编译器报错显示参数类型不匹配}
从ANSI C标准中对于约束条件的小结中有这么一句话:
每个实参都应该具有自己的类型,这样它的值就可以赋值给与它所对应的形参类型的对象(该对象的类型不能还有限定符)
上面这句话也就是说参数传递过程类似于赋值,再看以下赋值程序:
#include <iostream>using namespace std;int main(){ char *cp = new char[15]; const char *ccp = new char[15]; ccp = cp;//编译正确 cp = ccp;//编译错误 return 0; }
在ANSI C中对于简单赋值描述了以下约束条件:
要使赋值的形式合法,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
根据以上条件,可以很清楚的知道ccp = cp;合法而cp = ccp;这一个赋值不合法的原因:
ccp指向的类型为有限定符类型,而cp指向的类型为无限定符类型。cp = ccp的赋值语句违反了以上规定。
同理对于foo1参数的传递来说,p指向的类型为有限定符类型,而argv指向的类型为无限定符类型,当调用函数时,类似于赋值,左指针为p,右指针为argv,满足约束,故编译器没有报错。
对于foo2参数的传递来说,p与cp均是没有限定符的指针类型,但是它们指向的类型不一样,p指向const char* 而cp指向char*,因此编译器必然会产生一条诊断信息。
0 0
- const关键字进阶
- const关键字
- const关键字
- const关键字
- 关键字const
- const关键字
- const关键字
- const关键字
- const 关键字
- 关键字 const
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- const关键字
- 关键字 const
- 窗体随着另外一个窗体的变化而变化 的解决办法
- (17)html框架之<iframe>
- poj 2337 Catenyms(欧拉路+字典序+打印路径)
- 23岁的女孩
- 【存储管理】越界访问与用户堆栈的扩展
- const关键字进阶
- Mybatis 贴吧问答 第一期
- 本博客转型 ACM博客---->技术博客
- poj 1664 放苹果
- 分布式代码管理工具git(1)
- 开始学习Orchard
- 关于用 type()判断字段类型
- H3C配置三层交换机配置实例
- const总结