C++语言强制规定,const的对象只能用const指针指向,所以在34楼的代码中,指针才被迫写成强制转型,否则编译不通过,这点有容自己非常清楚。也就是说,编译器已经知道你会出问题,但你既然明确要转型,它也不拦着,只能随你愿,其结果是未定义行为,所以两种代码两种现象,一个能改原值,一个不能改(不能改的那个相当怪异,不知道其*p值是怎么来的,同一个地址,居然有两个不同的值,这点我专门跟踪过,无法解释)。至于C代码,其实也一样,同样报出那个错误,也是必须要转型才通过的。
C++不赞成使用C的旧式转型语法,所以提供了四种不同的转型语法。34楼的转型,在编译时实际上被执行为const_cast<int*> &x,即把对象的const取消掉,但事实上x对象所在的位置,极可能是真的无法修改的,所以x有时能被改掉,有时不能,结果不确定,这取决于编译器把x数据放在哪里。《C++编程规范》中有五、六条告诫很强烈地警告不要频繁使用转型,说如果代码中转型语句太多即意味着代码编写不良,要考虑重新设计,特别地是reinterpret_cast类的转型(C转型语法视不同环境被编译器实现为某种C++的转型,更令程序员没意识已经写下危险的代码),比如多态使用数组之类,union也是与reinterpret_cast类似的行为但更阴险。
其实,34楼代码中强制转型,就非常突兀,程序员写出这样的代码,就应该再三追问自己:为什么要这样做?
图片附件: 游客没有浏览图片的权限,请
登录 或
注册
[
本帖最后由 TonyDeng 于 2012-7-29 12:51 编辑 ]