C++标准转换运算符const_cast

前说了C++继承并扩大C语言的民俗类类转换方式,最后留下了片关于指针和援上之变问题,没有举行详细地讲述。C++相比叫C是平帮派面向对象的言语,面向对象最可怜的特色有即是兼具“多态性(Polymorphism)”。

设惦记特别好的使用多态性,就非不了若动指针和援,也无不了会客赶上转换的问题,所以在当时同首,就把老师说的同当网上反复查看了解的知识总结一下。

C++提供了季单易运算符:

  • const_cast <new_type>
    (expression)
  • static_cast <new_type> (expression)
  • reinterpret_cast <new_type> (expression)
  • dynamic_cast <new_type> (expression)

其有着相同之布局,看起像是模板方法。这些艺术就是是供被开发者用来开展指针和援的更换的。

其实自己死去活来已经想写这篇内容之,自己不停地查看导师发来之材料,也以网上不鸣金收兵地圈相关的学识,却一直迟迟未能够完全了解C++转换运算符的用法,倒是看
了那些资料后先勾勒了相同首传统转换点的内容。虽然于字面上异常好掌握它们大体是呀打算,但是确像用起来,却用非理解他们实际的用,只会持续的给编译
器提醒Error。所以如果起理解不完了或错的地方,还希望前人或来者能够指正。

在我看来这些标准运算符的用意就是指向传统运算符的代表,以便就统一。就如咱就此std::endl来输出换行,而非是’\n’。我会见因此代码来说明
相应的风俗人情转换可以怎么这些规范运算符。当然,这马上是大约的知情,在正儿八经运算符上,编译器肯定起做更多之处理,特别是dynamic_cast是无可知就此传
统转换方式来完全实现的。

当当时同样首文章里,我会先说说我本着const_cast运算符的明白。

const_cast (expression)

const_cast转换符是用来移除变量的const或volatile限定符。对于后人,我无是极致明白,因为她涉及到了多线程的计划性,而自我当这点从来不呀了解。所以我仅吧const方面的内容。

用const_cast来去除const限定

于const变量,我们无能够修改其的价,这是其一范围符最直白的变现。但是我们就是想违其的限量希望改该情节怎么处置呢?

脚的代码显然是齐不顶目的的:
const int constant = 10; int modifier = constant;

盖对modifier的改并无见面影响到constant,这暗示了一点:const_cast转换符也未该用在对象数据达,因为这么的换得到的星星只变量/对象并没相关性。

只有用指针或者引用,让变量指向同一个地点才是釜底抽薪方案,可惜下边的代码在C++中也是编译不过的:
const int constant = 21; int* modifier = &constant // Error: invalid conversion from 'const int*' to 'int*'

(上边的代码在C中是可编译的,最多会博得一个warning,所在在C中达到同步就是足以起来针对constant里面的数胡作非为了)

管constant交给非const的援也是可怜的。
const int constant = 21; int& modifier = constant; // Error: invalid initialization of reference of type 'int&' from expression of type 'const int'

于是const_cast就出消灭const,以求招程序世界之紊乱。

下面的代码就万事大吉编译功过了:
const int constant = 21; const int* const_p = &constant; int* modifier = const_cast<int*>(const_p); *modifier = 7;

俗转换方式贯彻const_cast运算符

自家说过标:准转换运算符是可以就此传统转换方式贯彻之。const_cast实现由纵然在于C++对于指针的变换是随意的,它不会见检查项目,任何指针之间还足以进行交互转换,因此const_cast就可直接行使显示转换(int*)来代替:
const int constant = 21; const int* const_p = &constant; int* modifier = (int*)(const_p);

要我们还足以把他们合成一个讲话,跳了中变量,用
const int constant = 21; int* modifier = (int*)(&constant);

替代
const int constant = 21; int* modifier = const_cast<int*>(&constant);

胡而刨除const限定

从前方代码中曾经看,我们无可知对constant进行改动,但是我们得针对modifier进行再赋值。

而只是,程序世界真混乱了吧?我们真正通过modifier修改了constatn的价了啊?修改const变量的数据真的是C++去const的目的为?

比方我们将结果打印出来:
cout << "constant: "<< constant <<endl; cout << "const_p: "<< *const_p <<endl; cout << "modifier: "<< *modifier <<endl; /** constant: 21 const_p: 7 modifier: 7 **/

constant还是封存了其原本的价值。

然而她确实对了和一个地方呀:
cout << "constant: "<< &constant <<endl; cout << "const_p: "<< const_p <<endl; cout << "modifier: "<< modifier <<endl; /** constant: 0x7fff5fbff72c const_p: 0x7fff5fbff72c modifier: 0x7fff5fbff72c **/

立真的是一律码奇怪的政工,但是这是起好事:说明C++里是const,就是const,外界千变万变,我就是无移。不然真的会乱套了,const也没存在的意义了。

IBM的C++指南称呼“*modifier
= 7;”为“未定义行为(Undefined
Behavior)”。所谓不定义,是说这个话以正式C++中从未显著的确定,由编译器来支配如何处理。

号运算的左移操作为只是到头来一种植不定义行为,因为我们不确定是逻辑左移,还是算左移。

再也比如下面的语:v[i] = i++;
也是一模一样栽不定义行为,因为咱们无了解是先行举行自增,还是先用来查找数组被的职。

于未定义行为,我们所能够举行的所要召开的就算是避免出现这样的言辞。对于const数据我们重使如此保证:绝对免对准const数据进行再赋值。

一经我们无思修改const变量的值,那我们而为何而失去const呢?

由是,我们也许调用了一个参数不是const的函数,而我辈要传进的实际参数确实const的,但是咱知道之函数是无见面对参数做修改的。于是我们虽需使用const_cast去除const限定,以便函数能够经受之实际参数。

 #include <iostream> using namespace std;  void Printer (int* val,string seperator = "\n") {  cout << val<< seperator; }  int main(void)  {       const int consatant = 20;   //Printer(consatant);//Error: invalid conversion from 'int' to 'int*'  Printer(const_cast<int *>(&consatant));       return 0; }

出现这种气象的由,可能是咱所调用的不二法门是人家写的。还有同栽自我能够体悟的案由,是起在const对象想调用自身的非const方法的上,因
为以接近定义着,const也可以当函数重载的一个标示符。有空子,我会专门回顾一下己所知道const的用法,C++的const真的发生无限多得说的
了。

在IBM的C++指南倍受尚关系了别一样种植或用去const的状:

#include <iostream> using namespace std;  int main(void) {     int variable = 21;  int* const_p = &variable;   int* modifier = const_cast<int*>(const_p);        *modifier = 7   cout << "variable:" << variable << endl;      return 0; }  /** variable:7 **/

咱们定义了一个非const的变量,但因故带const限定的指针去因为它,在某个同处于我们蓦然而想改了,可是我们当前只有指针,这时候我们好错过const来修改了。上边的代码结果吗说明我们修改成功了。

只是自己觉着这并无是一个吓的筹划,还是应遵守这样的基准:使用const_cast去除const限定的目的绝对免是为修改它的内容,只是出于无奈。(如果确实像自家身为种无奈,似乎const_cast就未极端来采取的时了,但真的我呢异常少用到她)

Director: Jim
Fawcett

  1. C++ Language Tutorial – Type
    Casting
  2. Object Oriented
    Design
  3. IBM Complilers – XL C/C++ V9.0 for Linux – The const_cast operator
    (C++
    only)
  4. stackoverflow: Is const_cast
    safe?

转 自

http://www.cnblogs.com/ider/archive/2011/07/22/cpp\_cast\_operator\_part2.html