在生活或工作中,对于一些文件、程序或数据,需要设定对它们的读写权限。在必要的时候,如果限定一些数据只具有“读”的权限,而不能对它们进行赋值或修改,这时,我们需要使用 ‘const’ 对数据进行修饰。
在对const进行解释之前,先引入两个名词:左值、右值;
左值:放在“=”(赋值)符号左边的就是左值。其他情况都是右值。例如:a = 10,a为左值;a<10,a为右值。
左值:写权限;可以对左值进行赋值、修改等操作。
右值:读权限;只能读取右值,不能对它进行赋值修改操作。
const:限定变量的权限,变成只读(不能做左值)。
例如:int a;
a = 10; //左值,放在"="符号左边就是左值,其它情况都是右值
int b = a;
const int ca = 10; //限定写权限,变成只读
b = ca; //ok;将ca的值赋值给b,对ca只进行“读”操作;
ca = 20; //error;将20赋值给ca,对ca进行了“写”操作,语句错误;
const int cb; //error;由于后续不能再对cb进行赋值,需要在定义cb的时候进行赋值,否则cb无意义
1、基本数据类型对于const透明;
例如: const int ca = 10;
int const cb = 20; //这两个语句的作用是一样的;const可以忽略数据类型,只修饰ca和cb
2、const修饰它的直接右边;
例如: int a = 10;
int b = 20;
int *p = &a;
p = &b;
int *q = &a;
q = p;
*p = 200;
b = *p;
const int *p1 = &a;
p1 = &b; //ok,数据类型int对于const是透明的,而‘*’不是,所以const忽略int直接修饰 *p1;
*p1 = 1000; //error,因此可以修改p1,不能修改*p1;
int const *p2 = &a; //p2完全等同p1;
int *const p3 = &a; //const直接修饰p3;因此可以修改*p3,不能修改p3;
p3 = &b; //error
*p3 = 100; //ok
3、权限可以等同或者缩小传递,不能放大传递
例如: int a = 10;
int b = 20;
const int ca = 10;
int *p1 = &a;
*p1 = 20; //通过将p1解引用间接对a赋值,此时a=20;
p1 = &b;
int *p2 = &ca; //error,将指针p2设为ca的地址,从而可以通过将p2解引用间接对ca进行赋值,权限放大传递,语句错误
const int *p3 = &a;
const int *p4 = &ca; //指针p4存储ca的地址,const修饰*p4,因此*p4只有“读”操作,对p赋值修改的是ca地址,不影响
int *const p5 = &a;
int *const p6 = &ca; //error,const修饰的是p6,因此对*p6赋值是允许的,而*p6解引用可以间接对ca赋值因此语句正确,操作错误