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

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

[cpp] view plaincopy

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

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

时间: 2024-11-14 12:35:14

C++类型转换详解--const_cast(转载)的相关文章

Spring AOP详解(转载)

此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况 监控部分重要函数,若抛出指定的异常,需要以短信或邮件方式通知相关人员

Cocos2d-x 3.0坐标系详解(转载)

Cocos2d-x 3.0坐标系详解Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系.笛卡尔坐标系笛卡尔坐标系中定义右手系原点在左下角,x向右,y向上,z向外,OpenGL坐标系为笛卡尔右手系.屏幕坐标系和Cocos2d坐标系标准屏幕坐标系使用和OpenGL不同的坐标系,而Cocos2d则使用和OpenGL相同的坐标系.iOS, Android, Windows Phone等在开发应用时使用的是标准屏幕坐标系,原点为屏幕左上角,x向右,y向下.Cocos2d坐标系和Ope

Spring AOP详解(转载)所需要的包

上一篇文章中,<Spring Aop详解(转载)>里的代码都可以运行,只是包比较多,中间缺少了几个相应的包,根据报错,几经百度搜索,终于补全了所有包. 截图如下: 在主测试类里面,有人怀疑,没有main方法,是怎么运行的.这是用的junit,结合spring来进行的测试类. Spring AOP详解(转载)所需要的包,布布扣,bubuko.com

iOS申请发布证书-图文详解(转载)

本文讲述发布证书的申请,申请真机调试证书请参考:http://my.oschina.net/joanfen/blog/167730 首先登陆https://developer.apple.com(99美元账号) 选择iOS Developer program 板块下的 Certificates,Identifiers & Profiles 点击进入 b.进入 c.选择证书类型 distribution,选择添加 d.点击+后,选择distribution->App Store and Ad

linux进程地址空间详解(转载)

linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示windows上的结果也一样). 我们还是利用前面看到过的这个图,如下图:32位X86机器的内存布局图,内存主要分为栈.堆.BSS段.数据段.代码段5个段.   代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域.这部分区域的大小在程序运行前就已经确定,并且内存

linux TOP命令各参数详解【转载】

实时监控或查看系统资源使用情况的工具——TOP top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 下面详细介绍它的使用方法: (实时监控系统资源使用情况图) 统计信息区前五行是系统整体的统计信息: 第一行是任务队列信息,同 uptime  命令的执行结果.其内容如下: 01:06:48 当前时间 up 1:22 系统运行时间,格式为时:分 1 user 当前登录用户数 load average: 0.06, 0.60, 0.

DBMS_STATS.GATHER_TABLE_STATS详解(转载)

作用:DBMS_STATS.GATHER_TABLE_STATS统计表, 列,索引的统计信息. DBMS_STATS.GATHER_TABLE_STATS的语法如下: DBMS_STATS.GATHER_TABLE_STATS (   ownname          VARCHAR2,     tabname          VARCHAR2,     partname         VARCHAR2,   estimate_percent NUMBER,     block_sample

return view详解(转载)

1.return View(); 返回值类型:System.Web.Mvc.ViewResult将视图呈现给响应的 View() 结果. 注释 View() 类的此方法重载将返回一个具有空 ViewName 属性的 ViewResult 对象. 如果你正在编写控制器操作的单元测试,则需为那些不采用字符串视图名称的单元测试考虑到空 ViewName 属性. 在运行时,如果 ViewName 属性为空,则将使用当前操作名称取代 ViewName 属性. 2.return View(object mo

Nginx配置文件nginx.conf中文详解(转载)

请参考:http://wiki.nginx.org/Main #定义Nginx运行的用户和用户组 user www www; #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log ar/loginx/error.log info; #进程文件 pid ar/runinx.pid; #一个nginx进程打开的最多文件描述符