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(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
随机推荐
- Android学习系列(4)--App自适应draw9patch不失真背景
做人要大度,海纳百川,做事要圆滑,左右逢源,这让我想到了编程也是如此,代码要扩展,界面也要考虑自适应.这篇文章是Android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1. ...
- .NET中那些所谓的新语法
.NET中那些所谓的新语法之四:标准查询运算符与LINQ 摘要: 开篇:在上一篇中,我们了解了预定义委托与Lambda表达式等所谓的新语法,这一篇我们继续征程,看看标准查询运算符和LINQ.标准查询运 ...
- linux write系统调用如何实现
在Linux下我们在使用设备的时候,都会用到write这个函数,通过这个函数我们可以象使用文件那样向设备传送数据.可是为什么用户使用write函数就可以把数据写到设备里面去,这个过程到底是怎么实现的呢 ...
- Cocos2d-x动画工具类
1.此工具类的目的是为了方便运行动画.使用TexturePackerGUI工具能够导出plist文件和png图片,这里我演示样例图片叫bxjg.plist和bxjg.png ///////////// ...
- MySQL中 如何查询表名中包含某字段的表 ,查询MySql数据库架构信息:数据库,表,表字段
--查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where ta ...
- php 的session机制 和ecshop session机制
一.默认机制,用磁盘文件来实现PHP会话.php.ini配置:session.save_handler = files 1.session_start() A. session_start()是ses ...
- Install Ambari 2.2.0 from Public Repositories(Hadoop)
Step1: Download the Ambari repository on the Ambari Server host For Redhat/CentOS/Oracle: cd /etc/ ...
- 分享八:特殊的mysql函数
一:MYSQL自定义排序函数FIELD() MySQL可以通过field()函数自定义排序,格式:field(value,str1,str2,str3,str4),value与str1.str2.st ...
- 【转】如何遍历json数据
var value = { "china":{ "hangzhou":{"item":"1"}, "shang ...
- [hihoCoder] 骨牌覆盖问题·二
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上一周我们研究了2xN的骨牌问题,这一周我们不妨加大一下难度,研究一下3xN的骨牌问题?所以我们的题目是:对于3xN的棋盘 ...