首页 > 代码库 > C++类型转换详解--const_cast(转载)

C++类型转换详解--const_cast(转载)

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

 

一. 函数描述:
const_cast < type-id > ( expression )
主要是用来去掉const属性,当然也可以加上const属性。主要是用前者,后者很少用。

去掉const属性:const_case<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。

加上const属性:const int* k = const_case<const int*>(j),一般很少用,因为可以把一个非const变量直接赋给一个const变量,比如:const int* k = j;

 

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

[cpp] view plaincopy
 
  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.     //转换后指针指向原来的对象    
  21.     cout<< pca1->m_iNum <<pa2->m_iNum<<endl; //200 200    
  22.         
  23.     //2. 指针指向基本类型    
  24.     const int ica = 100;    
  25.     int * ia = const_cast<int *>(&ica);    
  26.     *ia = 200;    
  27.     cout<< *ia <<ica<<endl;   //200 100    
  28. }  

 

2. 常量引用转为非常量引用。

 

[cpp] view plaincopy
 
  1. class A  
  2. {  
  3. public:  
  4.   A()  
  5.   {  
  6.     m_iNum = 1;  
  7.   }  
  8.   
  9. public:  
  10.   int m_iNum;  
  11. };  
  12.   
  13. void foo()    
  14. {    
  15.    
  16.   A a0;  
  17.   const A &a1 = a0;  
  18.   A a2 = const_cast<A&>(a1); //常量引用转为非常量引用  
  19.       
  20.   a2.m_iNum = 200;    //fine    
  21.   
  22.   cout<< a0.m_iNum << a1.m_iNum << a2.m_iNum << endl; //1 1 200    
  23. }  

 

2. 常量对象(或基本类型)不可以被转换成非常量对象(或基本类型)。

 

[c-sharp] view plaincopy
 
  1. void foo()  
  2. {  
  3.  //常量对象被转换成非常量对象时出错  
  4.  const A ca;  
  5.  A a = const_cast<A>(ca);  //不允许  
  6.   
  7.  const int i = 100;  
  8.  int j = const_cast<int>(i);  //不允许  
  9.   
  10. }  

 

记住这种转换只是开了一个接口,并不是实质上的转换。(其实也算是实质上的转换了,只不过表达上不允许这样写)

3. 添加const属性

 

[c-sharp] view plaincopy
 
  1. int main(int argc, char ** argv_)   
  2. {  
  3.  int i = 100;  
  4.  int *j = &i;  
  5.  const int *k = const_cast<const int*>(j);  
  6.  //const int *m = j;   感觉和这样写差不多  
  7.   
  8.  //指的地址都一样  
  9.  cout <<i<<","<<&i<<endl; //100, 0012FF78  
  10.  cout <<*j<<","<<j<<endl; //100, 0012FF78  
  11.  cout <<*k<<","<<k<<endl; //100, 0012FF78  
  12.   
  13.  *j = 200;  
  14.  //*k = 200;   //error  
  15.   
  16.  return 0;  
  17. }  


 

三. 总结:
1. 使用const_cast去掉const属性,其实并不是真的改变原类类型(或基本类型)的const属性,它只是又提供了一个接口(指针或引用),使你可以通过这个接口来改变类型的值。也许这也是const_case只能转换指针或引用的一个原因吧。

 

2. 使用const_case添加const属性,也是提供了一个接口,来不让修改其值,不过这个添加const的操作没有什么实际的用途(也许是我认识太浅了)。

C++类型转换详解--const_cast(转载)