不坚挺的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对象还是最好转换为引用,这是一个万全之策。

posted @ 2013-04-23 22:32  youngzii  阅读(203)  评论(0编辑  收藏  举报