const的用法

一、定义常变量  例如:const int a = 10;我将通过以下代码段进行解释:

        int a = 10;//无任何权限,可读可写
	int b = a;//a做右值
	a = 100;//a做左值,左值:即放在赋值“=”符号左边的,用写权限,写入操作,即往a里写数据100
	const int ca = 100;//只读变量,不能做左值
	//ca = 200;//error
	//ca = 100;//error
	//const int cb;//error

二、数据类型对于const 是透明的(例如 :const int 等同于int const)  const是用来修饰变量的,数据类型写在const左右均无影响。同样我将通过以下代码段进行解释:

        int const cc = 100;//由透明性可知cc和一中的ca没有区别
	b = cc;//cc做右值是可以的
	cc = 10;//error,不能做左值
	const int *cp1 = &a;//等价于 int const *cp1 = &a;*cp1不能做左值,但const可以,因为const直接修饰的是*cp1,这在const的第三条用法中将详细介绍
	cp1 = &b;//ok
	*cp1 = 20;//error

三、const直接修饰的内容不能做左值,解释代码段如下:

        int const *cp2 = &a;//由透明性可知cp2等同于二中的cp1
	cp2 = &b;//ok,const并未直接修饰cp2,cp2可做左值
	*cp2 = 20;//error,const直接修饰了*cp2,则*cp2不能做左值
	int *const cp3 = &a;
	cp3 = &b;//error,const直接修饰了cp3,则cp3不能做左值
	*cp3 = 100;//ok,const并未直接修饰*cp3,*cp3可做左值	*cp2 = 20;//error,const直接修饰了*cp2,则*cp2不能做左值
	int *const cp3 = &a;
	cp3 = &b;//error,const直接修饰了cp3,则cp3不能做左值
	*cp3 = 100;//ok,const并未直接修饰*cp3,*cp3可做左值

四、权限的传递:同等或者缩小传递是合法的,但放大传递是非法的,解释代码段如下:

        int a  =10;//可读可写
	int b = 20;//可读可写
	int const ca = 100;//可读
	int const cb = 200;//可读
	int *p = &a;//ok,因为 *p和&a均为可读可写,所以可以进行赋值操作
	p = &ca;//error,若赋值ca给p,那么p就有可能通过解引用试图改变权限。p本身可以解引用,但ca为可读,本身不允许写操作。例:*p = 100;p有可能通过解引用修改了ca被封锁写的权限
	int const *cp1 = &a;//a无任何限制,可读可写
	cp1 = &ca;//ok,cp1被const封锁了解引用的权限,不能解引用,ca本身不可写,所以该赋值操作可以进行
	int *const cp2 = &a;
	//cp2 = &ca;//error,cp2可解引用,但ca不可写
	//int *const cp3 = &ca;//error,cp3可解引用,但ca不可写

   const修饰形参指针,不能阻止传指针,但可阻止解引用。

  值得注意的是,如 const  (char) *strsource 防止修改源的值,不允许源解引用做左值。

猜你喜欢

转载自blog.csdn.net/Aspiration_1314/article/details/79662156
今日推荐