现在的位置: 首页 > 综合 > 正文

const_cast

2013年12月01日 ⁄ 综合 ⁄ 共 1355字 ⁄ 字号 评论关闭

const_cast用于添加或者删除指针或者引用的const属性,但是对于删除const属性的功能有一些bug:

可以构造结构体或者类的非const指针或者引用给新变量,但是原变量的const属性不变化,新变量可以修改对应的内容;但是如果是一个基本类型的const变量,譬如cosnt char *,const int等等,不会修改其内容。

所以,还是应该遵从这样的原则:使用const_cast去除const限定的目的绝对不是为了修改它的内容(来自:http://www.cnblogs.com/ider/archive/2011/07/22/cpp_cast_operator_part2.html)其中有些观点很有概括性,譬如:C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换。int
* 可以强制转换为float*,const int *可以强制转换为int *,int *可以转换为char *

以下转自:http://blog.csdn.net/lwbeyond/article/details/6213382


1. 常量指针被转化成非常量指针,转换后指针指向原来的变量(即转换后的指针地址不变)。

[c-sharp] view
plain
copy

  1. class A  
  2. {  
  3. public:  
  4.  A()  
  5.  {  
  6.   m_iNum = 0;  
  7.  }  
  8.   
  9. public:  
  10.  int m_iNum;  
  11. };  
  12.   
  13. void foo()  
  14. {  
  15.  //1. 指针指向类  
  16.  const A *pca1 = new A;  
  17.  A *pa2 = const_cast<A*>(pca1);  //常量对象转换为非常量对象  
  18.  pa2->m_iNum = 200;    //fine  
  19.  //转换后指针指向原来的对象  
  20.  cout<< pca1->m_iNum <<pa2->m_iNum<<endl; //200 200  
  21.   
  22.  //2. 指针指向基本类型  
  23.  const int ica = 100;  
  24.  int * ia = const_cast<int *>(&ica);  
  25.  *ia = 200;  
  26.  cout<< *ia <<ica<<endl;   //200 100  
  27. }  


第一个工作正常,但后一个程序不能正常工作!!我继续尝试了不同的类型,比如char,short,float,double等,发现了规律,凡是对结构体或类进行这个转换,都是成功的,但对char,short等基本类型的转换都没有成功。这是为什么呢?反汇编如下:

反汇编发现,虽然我没有使用优化,但系统还是对ica这个const进行了预编译般的替换,将它替换成“64h”(十六进制的64就是十进制的100)。其实ica地址上的值已经变了,这点从ia的输出可以看出,但由于系统对这个ica进行了预编译替换,从而导致输出ica的值没有变。这算是个C++的bug吧。

 

2. 常量引用被转换成非常量引用。

[c-sharp] view
plain
copy

  1. class A  
  2. {  
  3. public:  
  4.  A()  
  5.  {  
  6.   m_iNum = 0;  
  7.  }  
  8.   
  9. public:  
  10.  int m_iNum;  
  11. };  
  12.   
  13. void foo()  
  14. {  

抱歉!评论已关闭.