因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法。
对象的类型转换包含了对象的引用或指针。
1.static_cast是编译器默认选项,该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
但是没有动态检查所以类对象间非直线继承转换不支持(无关对象指针类型),C风格的转换确是可以的,所以并不是C风格转换的替代品。
所以基本类型转换,类上行转换(类的下行转换有隐患),把其它类型转换为void*都是安全的(void*转换为目标类型就要小心了)。
2.dynamic_cast是动态类型转换提前检查:
该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*。
1)下行转换,兄弟之间转换,动态实例到当前指针非直线继承转换
如果不安全(父实例不能下行,兄弟实例不能相互转换),那么会提前得到空指针。
如果安全,那么下行转换和对象间非直线继承转换(包括上行)还需要有虚函数,才支持动态转换(实例合理则不为空),一般继承中都用虚析构函数故基本是没问题的。
2).上行转换和多继承情况:
多继承中,多条路径时候需要多次dynamic_cast指定以表明用具体路径进行转换。
3.const_cast一般将常量转换为非常量指针,用非常量指针对数据进行修改。该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
4.reinterpret_cast是将一种类型无位损失的转换为另一种类型例如字符串转换为整型,他们的内存结构会是一样的,也可以把一种类型转换为*void再由于*void转换回该类型。
type-id 必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。
特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。
测试实例:
class A
{
public:
int a;
A()
{
a = 0;
}
virtual void display()
{
cout<< "I am A"<<endl;
}
virtual ~A()
{
}
};
class AImpl: public A
{
public:
int b;
AImpl()
{
b = 0;
}
virtual void display()
{
cout<< "I am AImpl"<<endl;
}
virtual ~AImpl()
{
}
};
class B: public AImpl
{
public:
int b;
B()
{
b = 0;
}
virtual void display()
{
cout<< "I am B"<<endl;
}
virtual ~B()
{
}
};
class C:public AImpl
{
public:
int a;
C()
{
a = 0;
}
virtual void display()
{
cout<< "I am C"<<endl;
}
virtual ~C()
{
}
};
class D: public B,public C
{
virtual void display()
{
cout<< "I am D"<<endl;
}
};
int main( int argc, char *argv[] )
{
D *d = new D();
B *b =dynamic_cast<B*>(d);
A *a = dynamic_cast<A*>(b);
AImpl *aimp= dynamic_cast<AImpl*>(a);
aimp->display();
}
reference:
http://www.cplusplus.com/doc/tutorial/typecasting/
https://msdn.microsoft.com/en-us/library/cby9kycs

C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结相关推荐

  1. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

  2. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

    文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...

  3. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨

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

  4. 类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.

    呵呵,今天来好好看看着几个转换操作符的用法.以前老是看着眼熟,但是用着手生.今天决定搞定这些个东西. 在C语言中类型转换有几种方式: 1.      (expression). 在表达式外边加括号,由 ...

  5. C++ 11 深度学习(五)类型转换:static_cast dynamic_cast const_cast reinterpret_cast

    四种cast 通用形式:强制类型转换名<type>(express) @强制类型转换名,以上四种  :@type:想要转成成的目标类型 : @express,需要转换的目标 static_ ...

  6. 类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等

    一.隐式类型转换 系统自动进行,不需要程序开发人员介入. int m = 3 +45.6; //把小数部分截掉,也属于隐式类型转换的一种行为. doublen = 3 +45.6; 二.显示类型转换( ...

  7. C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)

    一.概述 类型转换(cast)是将一种数据类型转换成另一种数据类型.例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 ).转换是非常有用的,但是它也会带来一 ...

  8. When should static_cast, dynamic_cast and reinterpret_cast be used?

    这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...

  9. C++中static_cast, dynamic_cast, const_cast用法/使用情况及区别解析

    目录 第1部分. 隐式类型转换 第2部分. 显式类型转换 static_cast dynamic_cast reinpreter_cast const_cast 首先回顾一下C++类型转换: C++类 ...

最新文章

  1. 找不到 tools.jar。请检查 C:\Program Files\Java\jre1.8.0_151 是否包含有效的 JDK 安装
  2. dijkstra+priority_queue+vector
  3. 为 Notepad++ 安装 NppFTP 插件,查看修改虚拟机上的文本文件
  4. php链接没有下划线,html超链接怎么去掉下划线
  5. Web Service-第一篇什么是Web Service
  6. docker-compose进阶
  7. 财务系统 定制开发案例
  8. 数学建模 ---斯皮尔曼相关系数
  9. 计算机专业课科目,考研计算机专业课科目有哪些
  10. 推荐系统之从石器时代到青铜时代的演进史
  11. 三星 android 调试模式设置,三星 W2016 开启USB调试模式
  12. 2021年全国计算机能力挑战赛C++决赛,题目分享
  13. 2015InfoQ软件大会技术记录
  14. 使用163邮箱发送邮件报错(554, b'DT:SPM 163 smtp3,G9xpCgCHi5RJOFVemMZ4Dw--.348S3 1582643274,please see http://ma
  15. Python-Opencv 形态学+算子实现轮廓提取
  16. a view of a leaf Variable that requires grad is being used in an in-place operation.
  17. Uniapp自定义相机界面
  18. 唯众IT教学云平台获华为技术认证,入驻华为云严选商城
  19. 来聊聊云计算能否彻底改变业务和软件架构
  20. wince投屏苹果手机_全民最大党sjm:汽车上没有HDMI插口,怎么投屏?

热门文章

  1. pandas学习笔记三之处理丢失数据
  2. 刘小乐教授 - 生物信息学云论坛第三场报告会
  3. 国家植物标本资源库信息网正式上线
  4. php微信网页开发实现自动登录注册功能实例
  5. php str_replice_详解PHP字符串替换str_replace()函数四种用法
  6. 如何获取sharepoint列表_练习 34 - 获取列表元素 - Learn Python 3 The Hard Way
  7. python字符串_python字符串格式化
  8. input输入框禁止自动补全和下拉提示
  9. python虚拟环境和pyenv_Python多版本管理器pyenv和虚拟环境pyenv-virtualenv的安装设置...
  10. Qt实践| HTTP知识点-Qt填充referer请求头盗取图片