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*,因此编译器必然会产生一条诊断信息。