C++ 强制类型转换详解
类型转换只不过是让编译器以另外一种方式解释一块内存而已。C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性。
一、C风格的强制类型转换
double k = (double)(5 / 3);
这种类型转换是不执行任何检查的,这意味着以下类型转换同样能够通过编译:
struct A
{
int a;
double b;
};
int main(int argc, char *argv)
{
const char *msg = "Hello";
A *obj = (A *)msg; // 通过编译,但是不合法。
return 0;
}
这样obj
对象是不合法的。因此,C++代码最好不要采取这种做法。
二、C++类型转换:static_cast
static_cast
转换主要用于以下情况:
- 相关基本数据类型之间的类型转换
- 子类转换为父类类型
- 将
void*指针
转换为其它类型指针 - 同数据类型的引用类型的类型转换
class Base {};
class Derive : public Base {};
int main(int argc, char *argv[])
{
// 一:相关基本数据类型之间的类型转换
int a = static_cast<int>(4.2);
// 二:子类转换为父类类型
Base base = static_cast<Base>(Derive());
// 三:将void*转换为其它类型指针
void *p = &a;
int *pa = static_cast<int*>(p);
// 四:同数据类型的引用类型的类型转换
int &aref = static_cast<int&>(a);
int &&arref = static_cast<int&&>(a);
return 0;
}
三、C++类型转换:dynamic_cast
dynamic_cast
用于将父类指针(或引用)向子类指针(或引用)的类型转换。
注意:为了使用dynamic_cast
,类中必须包含虚函数。
class Base {};
class Derive : public Base {};
int main(int argc, char *argv[])
{
Base *b = new Derive();
Derive *d = dynamic_cast<Derive*>(b);
return 0;
}
四、C++类型转换:const_cast
const_cast
用于除去指针或者引用的const
属性:
int main(int argc, char *argv[])
{
const int a = 0;
const int *const p = &a;
int *pa = const_cast<int*>(p);
*pa = 10; // a = 0, *pa = 10
return 0;
}
由于const
限定符,a
的值不会被改变,详见:C++ const详解。
五、C++类型转换:reinterpret_cast
reinterpret_cast
处理无关数据类型之间的转换。
struct A
{
int a;
double b;
};
int main(int argc, char *argv)
{
A a = {0, 0};
A *pa = &a;
char *c = reinterpret_cast<char*>(pa);
return 0;
}
C++ 强制类型转换详解的更多相关文章
- C++四种强制类型转换详解
什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式.为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符. C与C++的类型转换 //C中: //复 ...
- Java类型转换详解
Java类型转换详解 最近有同学问:自动类型转换老是记不住,到底是大转小,还是小转大 其实这个不用死记硬背,很好理解,我们拿 int 和 short 来举例: int 是 4 字节,也就是 32 bi ...
- java类型转换详解(自动转换和强制转换)
自动转换 class Hello { public static void main(String[] args) { //自动转换 int a = 5; byte b = 6; int c = a ...
- javascript强制转换详解
转换成数值 Number函数强制转换成数值 数值->转换成原来的值 字符串->如果可以解析为数值,则转换成数值:否则转换成NaN或者0 true->1,falSe->0 und ...
- php对字符串的操作3之 字符类型转换详解
所有的数据输出到屏幕上,实际上被隐式的转换成了字符型,首先了解下各种数据类型的字符串表示 <?php echo 300,'<hr>'; echo true,'<hr>'; ...
- Php中的强制转换详解
强制转换中分为两种,第一种就只临时转换,和永久转换.在临时转换中呢,首先可以通过第一中方式来显示,就是小括号的形式,临时转换成整型我们可以通过(int)都是这样的形式,或者是(integer)临时转换 ...
- 关于Struts2的类型转换详解
详细出处参考:http://www.jb51.net/article/35465.htm 一.类型转换的意义 对于一个智能的MVC框架而言,不可避免的需要实现类型转换.因为B/S(浏览器/服务器)结构 ...
- 【转】C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
- C-printf/sprintf/snprintf中的类型转换详解
源码1 #include <stdio.h> void f1() { double x = -5.5625; printf("%d\n",x); //输出为0,为什么? ...
随机推荐
- 从零开始のcocos2dx生活(二)Node
节点 Node 文章目录 节点 Node 前言 变量初始化 创建一个节点对象 获取节点依赖的计数器 获取节点的描述(获取节点的Tag) 节点的局部层顺序值(LocalZOrder) 设置节点的Loca ...
- CommandPattern(命令模式)-----Java/.Net
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...
- GraphicsLab Project之Diffuse Irradiance Environment Map
作者:i_dovelemon 日期:2020-01-04 主题:Rendering Equation,Irradiance Environment Map,Spherical Harmonic 引言 ...
- JAVA字节码文件之常量池
一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符 ...
- spring系列框架篇-承接各类型中小型项目-期待与您的长期合作!
框架选型: 1.基本框架:springboot2.2+springcloud(Hoxton.M2)+nacos (所有公共模块全部使用 starter 方式依赖) 2.授权及权限:oauth2+jwt ...
- 开源API网关,你选对了么?
开源API网关,你选对了么? api网关的本质 不用扯那么多,也不用画图,一句话说清楚 api网关:流量总入口,得以集中控制! 就这么简单 api网关协议上最基本要支持HTTP 和 WebSocket ...
- Android系统启动过程分析
Android系统启动过程分析 一.Android平台架构 首先贴一张Android系统架构图方便理解整个Android架构,这可以让我们从整体上对整个启动流程有个大概认知. 可以看出整个架构由5部分 ...
- 源码详解系列(六) ------ 全面讲解druid的使用和源码
简介 druid是用于创建和管理连接,利用"池"的方式复用连接减少资源开销,和其他数据源一样,也具有连接数控制.连接可靠性测试.连接泄露控制.缓存语句等功能,另外,druid还扩展 ...
- 二分查找LintcodeNo14
14First Position of Target 二分查找的基础题 STL lower_bound实现 class Solution { public: /** * @param nums: Th ...
- c++中减字符0的作用(转)
在刷OJ题的时候遇到要读取“2013-3-1”形式的日期然后计算这个日期是该年的第几天, 显然我们读取的是字符串,但是计算第几天却要整型数来计算,这是这个问题的难点,下面是解决这个问题的代码: int ...