函数原型:

const_cast < type-id > ( expression )

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

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

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

class A
{
  public:
    A()
    {
      m_iNum = ;
    }    public:
    int m_iNum;
}; void foo()
{
    //1. 指针指向类
  const A *pca1 = new A;
  A *pa2 = const_cast<A*>(pca1); //常量对象转换为非常量对象
  pa2->m_iNum = ; //fine   //转换后指针指向原来的对象
  cout<< pca1->m_iNum <<pa2->m_iNum<<endl; //200 200
  
  //2. 指针指向基本类型
  const int ica = ;
  int * ia = const_cast<int *>(&ica);
  *ia = ;
  cout<< *ia <<ica<<endl; //200 100
}

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

class A
{
public:
  A()
  {
m_iNum = ;
  }
public:
  int m_iNum;
}; void foo()
{   A a0;
  const A &a1 = a0;
  A a2 = const_cast<A&>(a1); //常量引用转为非常量引用   a2.m_iNum = ; //fine   cout<< a0.m_iNum << a1.m_iNum << a2.m_iNum << endl; //1 1 200
}

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

void foo()
{
  //常量对象被转换成非常量对象时出错
  const A ca;
  A a = const_cast<A>(ca); //不允许
  
  const int i = ;
  int j = const_cast<int>(i); //不允许 }

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

4.添加const属性

int main()
{
  int i = ;
  int *j = &i;
  const int *k = const_cast<const int*>(j);
  //const int *m = j; 感觉和这样写差不多   //指的地址都一样
  cout <<i<<","<<&i<<endl; //100, 0012FF78
  cout <<*j<<","<<j<<endl; //100, 0012FF78
  cout <<*k<<","<<k<<endl; //100, 0012FF78   *j = ;
  //*k = 200; //error   return ;
}

总结

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

2. 使用const_cast添加const属性,也是提供了一个接口,来不让修改其值,不过这个添加const的操作没有什么实际的用途。

const_cast的更多相关文章

  1. c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast  [版权声明]转载请注明出处 http://www.cnblogs.c ...

  2. C++强制类型转换操作符 const_cast

    const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...

  3. static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别

    static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...

  4. [转载]const_cast

     1. 一个经典实例 /* 用法:const_cast<type_id> (expression) 该运算符用来修改类型的const或volatile属性.除了const 或volatil ...

  5. c++强制类型转换:dynamic_cast、const_cast 、static_cast、reinterpret_cast

    c++强制类型转换:dynamic_cast.const_cast .static_cast.reinterpret_cast 博客分类: C/C++ CC++C#编程数据结构  dynamic_ca ...

  6. static_cast dynamic_cast const_cast reinterpret_cast总结对比

    [本文链接] http://www.cnblogs.com/hellogiser/p/static_cast-dynamic_cast-const_cast-reinterpret_cast.html ...

  7. static_cast, dynamic_cast, const_cast

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  8. 强制类型转换(const_cast)

    [1] const_cast的作用 一.常量指针被转化成非常量指针,并且仍然指向原来的对象: 二.常量引用被转换成非常量引用,并且仍然指向原来的对象: 三.常量对象被转换成非常量对象. [2] 实例代 ...

  9. C++-const_cast, reinterpret_cast, static_cast的用法

    /////////////////////////////////////////////////////////////////////////////// // // FileName : cas ...

  10. C++-const_cast只能用于指针和引用,对象的const到非const可以用static_cast

    Static_cast可以对对象也可以对指针也可以对引用,但是const_cast只可以对指针和引用使用,后者不可以对对象用,如果你要把一个const值转化为非const值只能用隐式执行或通过使用st ...

随机推荐

  1. Android实现录屏直播(一)ScreenRecorder的简单分析

    http://blog.csdn.net/zxccxzzxz/article/details/54150396 Android实现录屏直播(一)ScreenRecorder的简单分析 Android实 ...

  2. jmeter导入csv压测

    压测csv数据源(设置为utf-8格式),jmeter不需要第一行参数名 新建一个线程组,根据压测数据调整设置需要的循环次数(测试数据有9行,设置循环次数为9) 添加http头信息 Content-T ...

  3. Python笔记 #16# Pandas: Operations

    10 Minutes to pandas #Stats # shift 这玩意儿有啥用??? s = pd.Series([1,5,np.nan], index=dates).shift(0) # s ...

  4. Python面试题目之列表去重并维持原来顺序

    题目: 列表去掉重复元素,并保持原来的排序 方法一: # 待处理的列表 L1 = [111,44,55,33,22,11] # 利用集合set的属性,去重 s1 = set(L1) # 把集合转化为列 ...

  5. P3327/bzoj3994 [SDOI2015]约数个数和(莫比乌斯反演)

    P3327 [SDOI2015]约数个数和 神犇题解(转) 无话可补 #include<iostream> #include<cstdio> #include<cstri ...

  6. 20145204 《Java程序设计》第7周学习总结

    20145204 <Java程序设计>第7周学习总结 教材学习内容总结 时间 GMT.UT.TAI 格林威治标准时间(GMT)的正午是太阳抵达天空最高点之时,因为地球公转轨道为椭圆且速度不 ...

  7. AOP 增强方法

    Spring AOP 提供了 5 种类型的通知,它们分别是 Before Advice(前置通知).After Returning Advice(后置通知).Interception Around A ...

  8. 【异常记录(七)】MVC:从客户端中检测到有潜在危险的 Request.Form 值 的解决方法 [转]

    从客户端(Content="<EM ><STRONG ><U >这是测试这...")中检测到有潜在危险的Request.Form 值. 说明:  ...

  9. hdu KiKi's K-Number 主席树

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  10. postman 安装桌面版

    https://github.com/postmanlabs/postman-app-support