一、static_cast基本上拥有与c旧式转型相同的威力与意义,以及相同的限制,不能够移除表达式的常量性,const_cast负责这个功能

二、const_cast用来改变表达式中的常量性,如果将const_cast用于上述以外的用途,那么转型动作会被拒绝,主要是将某个变量的常量性去除掉,因为非const实参可以赋值给常量形参

普通形参加不加const限定符对实参没有影响,引用形参和指针形参前面没有const限定符时,实参必须是非const的,而前面有const限定符时对实参也没有什么影响。

原因在于实参的传递方式不同,函数中的形参是普通形参的时,函数只是操纵的实参的副本,而无法去修改实参,实参会想,你形参反正改变不了我的值,那么你有没有const还有什么意义吗?引用形参和指针形参就下不同了,函数是对实参直接操纵,没有const的形参时实参的值是可以改变的,这种情况下怎能用函数来操纵const实参呢。

class widget{};
class specialwidget:public widget{};
void update(specialwidget *psw){} int main() {
specialwidget sw;
const specialwidget &csw = sw;
update(&csw);//&csw是const类型指针,与形参类型不兼容,出错
update(const_cast<specialwidget*>(&csw));//正确
widget *pw = new specialwidget;
update(pw);//出错,类型不一致
update(const_cast<specialwidget*>(pw));//出错,const_cast只能调节类型限定符,无法进行继承体系的向下转型动作
update(static_cast<specialwidget*>(pw));//正确
}

三、dynamic_cast用来执行继承体系中安全的向下转型,它无法应用在缺乏虚函数的类型上,也不能改变类型的常量性.如果你想为一个不涉及继承体制的类型执行转型动作,可使用static_cast,要改变常量性,则必须使用const_cast.如果转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是引用)表现出来

class widget{};
class specialwidget:public widget{};
void update(specialwidget *psw){} int main()
{
widget *pw;
update(dynamic_cast<specialwidget*>(pw));//错误,dynamic_cast的操作数必须包含多态类型
}

四、reinterpret_cast的最常用用途是转换函数指针类型,不具有移植性,某些情况下这样的转型可能会导致不正确的结果,所以应该尽量避免将函数指针转型。

int main()
{
typedef void(*funcptr) ();
funcptr funcptrArray[];
int dosomething(); funcptrArray[] = &dosomething;//错误,类型不符
funcptrArray[] = reinterpret_cast<funcptr>(&dosomething);//可通过编译
}

最新文章

  1. 更改Visual Studio 2015 默认的语言设置
  2. python 获取星期几
  3. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q35-Q39)
  4. Snapchat面经(师兄的)
  5. Python类和实例
  6. Windows7のping応答の設定
  7. MySQL的表分区(转载)
  8. spring 定义自己的标签 学习
  9. xntp的配置
  10. CentOS下编译安装Apache2(新)
  11. php处理表单中的复选框问题以及js实现全选
  12. 用PE安装操作系统时:无法创建新的系统分区 也无法定位现有系统分区 的解决办法
  13. 整理下git常用命令
  14. Python-10 字典dict
  15. windows 服务器同步互联网时间
  16. MYSQL常用函数(格式化函数)
  17. 将之前的Power idea公司的数据按照下图所示的格式在屏幕上显示出来。
  18. sdkbox 接facebook
  19. 《Linux内核设计与实现》第4章读书笔记
  20. how to configure logback for Mybatis to print my SQL

热门文章

  1. sql server查看某个表上的触发器
  2. sql server 2008 r2 无法定位到数据库文件目录
  3. 计算机网络、OSI模型、TCP/IP族
  4. 前端phtooshop基础
  5. Shorthand Argument Names $0 : 只用于指代Closer声明中的形参
  6. splice用法解析
  7. git 提交运用vim编辑器
  8. 微信小程序图片上传java后台(前后端代码)
  9. CSU2188: Substring
  10. Python模块 shelve xml configparser hashlib