• 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的操作没有什么实际的用途(也许是我认识太浅了)。

  • 相关阅读:
    @SuppressWarnings("resource")
    连续根据两个字段排序
    java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 出现错误
    java中数组的定义
    单表(多表需手动创建多个转换)插入,更新数据
    批量处理sql
    查询排序后前5名的信息
    面向对象详细
    Flask-SQLAlchemy
    Dbutils-数据库连接池
  • 原文地址:https://www.cnblogs.com/jameszhan/p/const_cast.html
Copyright © 2020-2023  润新知