不坚挺的const
在数据类型前加上关键字“const”,如const type name=value1,则变量name的值不能更改。
但是,name的值并不真的是不可修改的。
看这段代码:
const int a=100;
(int &)a=20;//编译运行都ok
此处通过强制类型转换为非常量引用,使得常量a的值可以修改了。
但笔者发现下面的代码就是错误的:
const int a=100;
(int)a=20;//编译error,提示‘=’:左操作数必须为左值
更奇怪的是:
const float b=0.0;
(float)b=1.0;//编译运行,ok
const flaot c=0.1;
(float&)b=1.1;//编译运行,ok
const double d=0.2;
(double)d=1.2;//编译运行,ok
const double e=0.3;
(double&)e=1.3;//编译运行,ok
此处,笔者的问题是,为何针对int型const,(int)a=20为何编译出错?
而对于float型和double型const,(float)b=1.0;(double)d=1.2为何编译没有出错?
纠结之下,决定写一些十分基础的代码来验证一下。
int aa=100;
(int)aa=20;//编译运行ok
相比int const a而言,此处没有编译错误,说明强制类型转换符返回结果为一个可以修改的变量。
那么(int)a究竟返回何物?
考虑到引用和被引用的变量具有相同的内存地址,可以在前面的代码中添加下面几行:
printf("address is:%x\n",&((int)a));//编译提示错误,error c2101:常量上的'&'
printf("address is:%x\n",&((int&)a));//编译运行ok,且有&((int&)a)与&a相等
printf("address is:%x\n",&((float)b));//编译运行ok,且有&((float)b)与&b相等
看来,虽然int,float,double都是内建类型,在加上const后,再进行类型转换时还是被区别对待的。
如此看来,修改一个const对象还是最好转换为引用,这是一个万全之策。