C++中static_cast, dynamic_cast使用方法
前言
Android的Framework层源代码中有非常多强制类型转换函数的调用。写惯了C代码的人一般都习惯以下这样的强制转换方式:
double a = 89;
int b = (int)a;
可是。在C++代码中,不推荐使用C这样的(type-id)的强制转换风格代码,更推荐使用C++的标准类型转换符:static_cast和dynamic_cast。
static_cast
static_cast的函数原型例如以下:
static_cast<type-id>(expression)
说明:
该运算符把expression转换为type-id类型。
详细使用方法例如以下:
- 用于类层次结构中基类和子类之间指针或引用的转换。向上转型(把子类的指针或引用转换成基类表示)是安全的;向下转型(把基类指针或引用转换成子类指针或引用)时,因为没有动态类型检查。所以是不安全的。
- 用于基本数据类型之间的转换。
- 把void指针转换成目标类型的指针。
演示样例:
// 1. 类转换
class Base {};
class Child : public Base {};
Child *a = new Child();
Base *b = static_cast<Base *>(a);
// 2.基本类型转换
int i = 5;
double r = static_cast<double>(i);
// 3. void* 类型转换
void *p = &i;
int *s = static_cast<int *>(p);
dynamic_cast
dynamic_cast的函数原型例如以下:
dynamic_cast<type-id>(expression)
说明:
该运算符把expression转换成type-id类型的对象。type-id必须是类的指针、类的引用或者void *。假设type-id是类指针类型,那么expression也必须是一个指针,假设type-id是一个引用,那么expression也必须是一个引用。
备注:
因为在Android源代码中我没有看到dynamic_cast的使用,所以这里就不正确dynamic_cast的使用做举例了。
C++中static_cast, dynamic_cast使用方法的更多相关文章
- C++中static_cast和dynamic_cast强制类型转换
在C++标准中,提供了关于类型层次转换中的两个关键字static_cast和dynamic_cast. 一.static_cast关键字(编译时类型检查) 用法:static_cast < ty ...
- static_cast, dynamic_cast, const_cast
http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...
- static_cast, dynamic_cast, const_cast探讨
转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 ...
- 【C++专题】static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
- C++之static_cast, dynamic_cast, const_cast
转自:http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 ...
- c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast
c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast [版权声明]转载请注明出处 http://www.cnblogs.c ...
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
随机推荐
- Oracle自定义函数和存储过程示例,自定义函数与存储过程区别
参考资料:http://www.newbooks.com.cn/info/60861.html oracle自定义函数学习和连接运算符(||) 贴一段中文文档示例,应该就可以开始工作了: --过程(P ...
- Python基本数据类型详细介绍(转)
1.空(None)表示该值是一个空对象,空值是Python里一个特殊的值,用None表示.None不能理解为0,因为0是有意义的,而None是一个特殊的空值.2.布尔类型(Boolean)在 Pyth ...
- PLSQL_动态语句的解析(概念)
2014-06-02 Created By BaoXinjian
- Linux时间子系统(十四) tick broadcast framework
一.前言 在内核中,有cpuidle framework可以控制cpu的节电:当没有进程调度到该cpu上执行的时候,swapper进程粉墨登场,将该cpu会被推入到idle状态.当然CPU的idle状 ...
- JavaScript - 返回头部
制作浮动top $(window).scroll( function() { var scrollValue=$(window).scrollTop(); scrollValue > 600 ? ...
- 赶集mysql军规
总是在灾难发生后,才想起容灾的重要性.总是在吃过亏后,才记得曾经有人提醒过. 一,核心军规 不在数据库做计算,cpu计算务必移至业务层 控制单表数据量,单表记录控制在千万级 控制列数量,字段数控制在2 ...
- 关于使用REST API
设计REST API的请求处理部分 REST API功能 通常, 我们希望借助REST API完成以下操作 - 创建一个新记录 - 读取一个list的记录 - 读取指定的记录 - 更新指定记录 - 删 ...
- Spring自动装配Bean详解
1. Auto-Wiring ‘no’ 2. Auto-Wiring ‘byName’ 3. Auto-Wiring ‘byType 4. Auto-Wirin ...
- Windows Store Apps 开发转载
懒得写了,就直接记录转载一下文章地址吧. 如何为应用定义全局默认字体:http://blogs.msdn.com/b/gautamdh/archive/2014/03/16/how-to-change ...
- extjs中组件监听器里面的回调函数说明
近期在看项目源代码的时候发现了例如以下代码,当中_searchSupplierStore是JsonStore对象 _searchSupplierStore.on('beforeload',functi ...