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