函数原型:

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. WebStorm下使用TypeScript

    TypeScript也可使用Visual Studio 进行开发 TypeScript官网地址:(http://www.typescriptlang.org/) 1.先安装WebStorm WebSt ...

  2. python中 @property

    考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self.score = ...

  3. Web安全之BurpSuite抓取HTTPS请求

    出现了问题,第一步要干什么呢? 当然是要去官方网站去找FAQ和help,先来练习一下英语 https://portswigger.net/burp/help/proxy_options_install ...

  4. 浅谈HashMap 的底层原理

    本文整理自漫画:什么是HashMap? -小灰的文章 .已获得作者授权. HashMap 是一个用于存储Key-Value 键值对的集合,每一个键值对也叫做Entry.这些个Entry 分散存储在一个 ...

  5. net.sf.json和 com.fasterxml.jackson中对象转json的区别

    近期做项目的时候,发现使用net.sf.json包中的JSONObject或JSONArray将对象转为json数据结构存在一个坑.当对String类型的属性赋值为null情况下,转为json结构为& ...

  6. ThinkPHP开发博客系统笔记之一

    1.前后台搭建 开发的第一步是搭建前后台系统.搭建前台系统的时候新建了LoginController控制器和登录界面View/Login/index.tpl.模板文件中需要引入js和css文件,这里想 ...

  7. 【Java----正则关键字转义】

    正则需要转义字符:'$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'   问题现象:  替换URL格式的字符串时 ...

  8. .Net频繁访问数据库的优化探究(一)

    知识点:DataTable.Linq.lamda表达式.Cache 场景:查询部门的所有员工和管理员,并分配相应的权限 实现过程一般为:查询部门,遍历部门(查询员工.分配权限.查询管理员.分配权限) ...

  9. Maximum Depth of Binary Tree,求树的最大深度

    算法分析:求树的最小最大深度时候,都有两种方法,第一种是递归思想.树最大最小深度,即为它的子树的最大最小深度+1,是动态规划的思想.还有一种方法是层序遍历树,只不过求最小深度时,找到第一个叶子节点就可 ...

  10. [sql]SET NOCOUNT ON 的作用

    使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息. 说明: 场景1:(不使用SET NOCOUNT) 场景2:(使用SET NOCOUNT ON ) 场景3:(使用SET N ...