我们首先先了解一下左值和右值;
const :定义常变量,不能写,只能读取。
const定义了一个常变量c,那么c只能读取,将100,200赋值给c就出现了错误。
(1)必须要初始化
错误原因:上图中 const int d ; 是非法,d是一个随机值;
(2)不能更改,只有在初始化的时候才能赋值;
(3)int a 定义一个整型变量a,const修饰可以放在哪个些地方呢?(思考一下)
那就是const可以放在这两个地方 :① int ② a
即 ① const int a;
② int const a;
放的位置不同是否含义也不一样,口说无凭,事实来证明。
两个语句含义相同,因为数据类型对于 const 是透明的。
(4)修饰指针;
const修饰指针可以放在几个地方(借用const修饰变量,思考一下)
int * p(定义了一个整型指针p)const 可以放在这样几个位置:① int ② * ③ p
即 ① const int * p1
② int const * p2
③ int * const p3
当const放在①,②位置上,与const修饰整型变量同理,含义是一样的const int * p1与int const * p2等价。
那这三个使用时有什么不同吗,当然有啦!看下面这段代码。
const int *p1 = &a;
p1 = &b; ok
*p1 = 200; error
p1的值可以修改保存的地址,但是整型指针不可以作为左值即不能解引用,是以为const直接修饰的是*p1并不是p1;
int const *p2 = &a;//p2等价p1cp2 = &b; ok
*p2 = 200; error
p2的值可以修改保存的地址,但是整型指针不可以作为左值即不能解引用,是以为const直接修饰的是*p2并不是p2;
int *const p3 = &a;p3 = &b; error
*p3 = 200; ok
p3不可以作为左值,值不可以改变,但是*p3可以即可以修改a地址所保存的值,是以为const直接修饰的是p3并不是*p3;
还有一种情况(较为复杂一般不用):
int const *const p4 = &a;
p4 = &b; error
*p4 = 100; error
P4和*p4的值都不能改变,是因为第一个const修饰的是*p4第二个const修饰的是p4,两个都不能作为左值。
总结:const用于封锁直接修饰的内容,该内容变为只读。
(5)权限不能放大,只能同等传递或缩小传递;(举个普通例子来说,就像你从图书馆借一本书,这本书你只有读的权限并没有写的权限,如果你把这本书借给了另一个人那么这个人也只有读的权限并没有写的权限;但是如果是你自己买了一本书,你既有写的权限也有读的权限,那你把这本书借给另一个人的时候,你要求他只能读不能写的话,那么他只能读就不能写;你要求他既能读也能写的话,那么他就能读也能写;)
练习:
int a = 10;//a具有读,写权限。
int b = 20;//b具有读,写权限。
const int ca = 10;//const 修饰 ca使其不能作为左值即没有写权限,只能读。
const int cb = 20;//const 修饰 cb使其不能作为左值即没有写权限,只能读。
int *p = &a;//ok,char型指针p保存a的地址。
p = &ca;//error,ca 只具有读的权限,p具有读和写的权限,所以有可能通过解引用修改ca的值。
const int *cp1 = &a; //ok,定义了一个const修饰的*cp1,对cp1不能解引用,但可以修改其所指地址。
cp1 = &b;//ok
cp1 = &ca;//ok
const int *cp2 = &ca;//ok,ca只具有读权限,*cp2不能解引用即没有写权限,所以不能修改ca的值。
int *const cp3 = &a;//cp3不能作为左值但是可以对cp3解引用,但是a具有读和写的权限。
int *const cp4 = &ca;//error,cp4不能作为左值但是可以对cp4解引用,但是ca只具有读的权限。
const int *const cp5 = &a;//cp5 和*cp5都不能修改,这个语句也就没什么用。
const int *const cp6 = &ca;//cp6 和*cp6都不能修改,这个语句也就没什么用。