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,为什么? ...
随机推荐
- 20191031-7 beta week 1/2 Scrum立会报告+燃尽图 05
此作业的要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9915 git地址:https://e.coding.net/Eusti ...
- cocos2dx 仿射变换
AffineTransform __CCAffineTransformMake(float a, float b, float c, float d, float tx, float ty) { Af ...
- $Noip2014/Luogu1351$ 联合权值 树形
$Luogu$ $Description$ 给定一棵树,每两个距离为$2$的点之间可以产生"联合权值","联合权值"定义为这两个数的乘积.求最大的联合权值以及所 ...
- 笔记软件->"Typora"
笔记软件->"Typora" 1 下载地址 www.typora.io 2 傻瓜安装后添加自定义样式 由于用户目录不同Users为当前系统用户名字 打开C:\Users\Ad ...
- Django2.2 Cache缓存的设计以及几种方式的 多级或单级缓存处理
首先照例说明一下缓存的作用以及Django中可以用到的缓存方式: 缓存的作用是用于数据项的再次加载,在设定的时间内可以无压力刷新或者再次访问该数据信息 方式一数据库缓存(Django原生的---有代码 ...
- ECShop二次开发指南-文件结构(二)
ecshop文件架构说明 注意:因各版权不一,大概参考/* ECShop 2.5.1 的结构图及各文件相应功能介绍 ECShop2.5.1_Beta upload 的目录 ┣ activity.p ...
- 洛谷P3413 SAC#1 - 萌数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P3413 题目大意: 定义萌数指:满足"存在长度至少为2的回文子串"的数. 求区间 \([L,R]\) ...
- HBase学习笔记(四)—— 架构模型
在逻辑上,HBase 的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列. 但从 HBase 的底层物理存储结构(K-V)来看,HBase 更像是一个 multi-dimensional m ...
- 使用git将本地文件提交到github存储库
1.首先你要安装git https://git-for-windows.github.io/ 去官网自行下载对应版本 2.安装好git服务器后,找到你项目的文件夹,右键git bash here打开命 ...
- 【 Tomcat 】tomcat8.0 基本参数调优配置-----(1)
Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证文件 ...