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
原创粉丝点击