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,为什么? ...
随机推荐
- 【题解】CTS2019珍珠(二项式反演+卷积)
[题解]CTS2019珍珠 题目就是要满足这样一个条件\(c_i\)代表出现次数 \[ \sum {[\dfrac {c_i } 2]} \ge 2m \] 显然\(\sum c_i=n\)所以,而且 ...
- $CF888G\ Xor-MST$ 最小生成树
正解:最小生成树 解题报告: 传送门$QwQ$ 发现$Kruskal$和$Prime$都不太可做,于是考虑$B$算法. 先大概港下$B$算法的流程趴$QwQ$.大概就,每次对每个联通块找到最近的联通块 ...
- BuilderPattern(建造者模式)-----Java/.Net
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
- shell脚本配置maven
#!/bin/bash # maven install mvnpath=/usr/local/maven # 不存在 if [ ! -d "$mvnpath" ]; then ec ...
- js菜单栏切换
先来看看需要实现的需求: 这是某购物网站上经常看到的效果 我们把网页的模型抽象出来,下面是我实现的效果图: 源代码仅供大家参考,具体如下: <!DOCTYPE html> <html ...
- SpringBoot集成Mybatis动态多数据源后,MybatisPlus的IPage失效的问题解决方案
背景 之前做数据抽取的时候,搭了一个mybatis动态数据源切换的架子.方便他们写抽取的代码.今天同事问我,架子里面的mybatisplus的IPage失效了是什么问题.想了一下,应该是写动态数据源的 ...
- Jaeger容器化部署
概述 Jaeger是由Uber开源的分布式追踪系统,一套完整的Jager追踪系统包括Jaeger-client.Jaeger-agent.Jaeger-collector.Database和Jaege ...
- python如何计算程序(代码块)的运行时间?
1.引入time模块 2.调用time模块的time()函数 :用来获取当前的时间,返回的单位是秒 # 引入一个time模块, * 表示time模块的所有功能, # 作用: 可以统计程序运行的时间 f ...
- 【PCIE-2】---PCIE配置空间及访问方式简介
对新手来说,第一步了解PCIE的相关基本概念,第二步了解PCIE配置空间,第三步深入研究PCIE设备枚举方式.本章主要总结第二步的PCIE配置空间 按照国际惯例,先提问题: 1. 什么是PCIE的配置 ...
- Replacing the deprecated Java JPEG classes for Java 7
[src: https://blog.idrsolutions.com/2012/05/replacing-the-deprecated-java-jpeg-classes-for-java-7/] ...