C++强制类型转换const_cast()注意事项
2015-04-09 17:28
351 查看
const_cast<>() 只能通过引用或指针来取消所指向的const变量的const属性。
比如
这句话就编译不通过。
但是改成指针形式就可以了。如下:
或者改成引用形式。引用有两种方式都成立,但是意义却不同:
第一种方式b是一个新的int变量,结果不和a联动。
第二种方式b是a的引用,结果是和a联动的。
但是——最关键的部分来了,如果const int a = 0;这句话是这么定义的,那么即使b和a就理论上来说应该是联动的,但事实上b和a还是不联动的。虽然这时有&b = &a(这里就指针的形式int *b = const_cast<int*>(&a);来说)仍然如此。也就是说如果写一条语句b = 1;打印b的值为1,而打印a的值还是为0。这是为什么呢?这是因为编译器在编译的时候就把a的值用字面值常量0取代了。
那么怎么解决这个理论上应该取消了const属性的const变量却不能修改其值的问题呢?
如果把const int a = 0;这句话改为如下内容:
这下问题迎刃而解。修改b就和修改a一样了。
有人说的好,C++的语言设计者是如此的纠结,明明前面定义了const的变量就是为了防止修改,却又为了给自己一条反悔的后路不惜祭出const_static,其他语言都没有这种玩意儿,不过这也有力说明了C++是多么灵活的语言。
综上所述,const_static还是慎用为好
比如
但是改成指针形式就可以了。如下:
第二种方式b是a的引用,结果是和a联动的。
但是——最关键的部分来了,如果const int a = 0;这句话是这么定义的,那么即使b和a就理论上来说应该是联动的,但事实上b和a还是不联动的。虽然这时有&b = &a(这里就指针的形式int *b = const_cast<int*>(&a);来说)仍然如此。也就是说如果写一条语句b = 1;打印b的值为1,而打印a的值还是为0。这是为什么呢?这是因为编译器在编译的时候就把a的值用字面值常量0取代了。
那么怎么解决这个理论上应该取消了const属性的const变量却不能修改其值的问题呢?
如果把const int a = 0;这句话改为如下内容:
有人说的好,C++的语言设计者是如此的纠结,明明前面定义了const的变量就是为了防止修改,却又为了给自己一条反悔的后路不惜祭出const_static,其他语言都没有这种玩意儿,不过这也有力说明了C++是多么灵活的语言。
综上所述,const_static还是慎用为好
相关文章推荐
- C++强制类型转换const_cast()注意事项
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- 【C++注意事项】5 Top-level const , The auto and decltype Type Specifier
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- 《The C++ Standard Library》第45页 用const修饰auto_ptr的注意事项
- 【c++强制类型转换】:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- C++中的强制类型转换const_cast
- C++中的'&'和const的使用注意事项!
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- [zz]c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast
- C++中static_cast、const_cast、reinterpret_cast的用法举例,附带举例说明强制类型转换时int和int&的区别
- C++ const用法及注意事项
- 【C++注意事项】5 Top-level const , The auto and decltype Type Specifier
- c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast