C++标准转换运算符const_cast

用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限定

在此以前边代码中一度见到,大家无法对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

它们具有一样的构造,看起来像是模板方法。那么些点子正是提必要开发者用来进行指针和引用的转移的。

要想很好的选取多态性,就免不了要使用指针和引用,也免不了会遭受转换的标题,所以在这一篇,就把导师讲的以及在网上反复查看通晓的文化计算一下。

骨子里自个儿很已经想写那篇内容的,本人不停地翻看导师发来的资料,也在网上不停地看有关的学问,却一贯迟迟不能完全知道C++转换运算符的用法,倒是看
了那1个资料后先写了一篇古板转换方面包车型大巴情节。就算从字面上很好精晓它们大体是什么样意义,可是真的像使用起来,却用不明了他们切实的用处,只会不停的被编写翻译器提示Error。所以只要出现通晓不完了或错误的地点,还期待前人或来者能够指正。

在这一篇小说里,笔者会先讲讲小编对const_cast运算符的知道。

C++提供了五个转移运算符:

前面讲了C++继承并扩张C语言的古板类型转换方式,最终留给了有的有关指针和引用上的变换难点,没有做详细地描述。C++相比较于C是一门面向对象的言语,面向对象最大的表征之一便是富有“多态性(Polymorphism)”。

以小编之见那个专业运算符的效果正是对守旧运算符的替代,以便形成统一。就像大家用std::endl来输出换行,而不是’\n’。笔者会用代码来表明相应的观念转换能够什么这几个标准运算符。当然,那那是大致的精通,在正儿八经运算符上,编写翻译器肯定有做更加多的拍卖,尤其是dynamic_cast是无法用古板转换格局来完全落到实处的。

历史观转换格局贯彻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_cast (expression)

const_cast转换符是用来移除变量的const或volatile限定符。对于后者,小编不是太精晓,因为它事关到了二十八线程的宏图,而自个儿在这上边从未怎么精通。所以本身只来说const方面包车型客车情节。