4-11.3 C++中的显式类转换
static_cast
1.用来改变基本类型:一般是高精度转低精度
显示地告诉程序阅读者和编译器,不考虑高精度想低精度转换时造成的精度损失
#include<iostream>
using namespace std;
int main(){
double d = 2.1;
int i = 6;
int res = i/d; //i被隐式地转换为double res=6/2.1 = 2
cout<<res<<endl; //输出2
res = i/static_cast<int>(d); //d被强制转换为int res = 6/2 = 3
cout<<res<<endl; //输出3
return 0;
}
2.恢复void* 指针类型
#include<iostream>
using namespace std;
int main(){
int i = 2;
void *p = &i; //无法通过p得到它所指对象的值
int *q = static_cast<int*>(p); //将其转换为int*,得到其所指向的值
cout<<*q<<endl; //输出2
return 0;
}
注意:void*在强制类型转换时只能转换为原来的对应类型,如例子中,只能转换为int*,否则会产生未定义行为
const_cast
用来去除底层const(low-level const)
#include<iostream>
using namespace std;
int main(){
const char *pc;
char *p = const_cast<char*>(pc); //把pc的底层const去除,否则无法对p进行初始化(p不是const)
int *ip = static_cast<int*>( const_cast<char*>(pc)); //去除const后再改变基本类型
return 0;
}
注:1.const_cast可以去除底层const,但不代表转换后的指针可以改变其指向的值,如果*p是一个const对象,依然不能用p改变其值。
2.const_cast只能去除const,不能改变对象的原类型,const_cast<string>(pc);是不行的,改用static_const<string>(pc);。
const_cast在函数重载时运用广泛
reinterpret_cast
为运算对象的位模式提供较低层次的重新解释,但并不真正改变对象类型
#include<iostream>
using namespace std;
int main(){
int *ip;
char *pc = reinterpret_cast<char*>(ip); //pc所指的真实对象实际上是int类型而不是字符
string s(pc); //用int*来初始化string显然会出现问题,但由于有显示类型转换,所以编译器不会报错
cout<<s<<endl;
return 0;
}
使用reinterpret_cast是非常危险的,用pc初始化str的例子很好地证明了这一点。其中的关键问题是类型改变了,但编译器没有给出任何警告或者错误的提示信息。当我们用一个int的地址初始化pc时,由于显式地声称这种转换合法,所以编译器不会发出任何警告或错误信息。接下来再使用pc时就会认定它的值是char*类型,编译器没法知道它实际存放的是指向int的指针。最终的结果就是,在上面的例子中虽然用pc初始化 str 没什么实际意义,甚至还可能引发更糟糕的后果,但仅从语法上而言这种操作无可指摘。查找这类问题的原因非常困难,如果将ip 强制转换成pc的语句和用pc初始化 string对象的语句分属不同文件就更是如此。
所以在编程时经历避免强制类型转换
旧式类型转换
(type)expr:c语言风格的函数类型转换,其含义并不清晰,根据语境会分别具有static\_cast、const\_cast、reinterpret\_cast的功能。
int *ip;
char *pc = (char*)ip; //作用同reinterpret_cast
所以追踪错误时会更加困难,不建议使用。
4-11.3 C++中的显式类转换的更多相关文章
- Spring装配bean(在java中进行显式配置)
1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行 ...
- C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数
在早期的C++中.假设须要一些接受一些參数的构造函数,同一时候须要一个不接收不论什么參数的默认构造函数.就必须显示地编写空的默认构造函数.比如: //tc.h class A{ private: in ...
- TCP/IP网络中的显式拥塞通告(ECN)
当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的"黑盒".TCP 包进入和流出这个盒子.有些时候进入盒子的包被丢失了.因为今天的数字和光媒体上出现比特级错误的机会非 ...
- C++中的显式类型转化
类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会丢失部分数据,所以如果不加(int)做强制转 ...
- Java :构造器中的显式参数和this隐式参数
1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...
- 【RS】CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Collaborative Filtering-CoupledCF:在推荐系统深度协作过滤中学习显式和隐式的用户物品耦合
[论文标题]CoupledCF: Learning Explicit and Implicit User-item Couplings in Recommendation for Deep Colla ...
- 008.在C#中,显式接口VS隐式接口
原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...
- selenium-webdriver中的显式等待与隐式等待
在selenium-webdriver中等待的方式简单可以概括为三种: 1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间 2 隐式等待,直接调用i ...
- 深入js系列-类型(显式强制转换)
什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...
- Golang 类型转换,断言和显式强制转换
1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...
随机推荐
- CH07_指针
CH07_指针 指针的基本概念 作用:可以通过指针间接访问内存 描述: 内存编号是从0开始记录的,一般用十六进制数字表示 可以利用指针变量保存地址 指针变量的定义和使用 语法: 数据类型 * 变量名; ...
- reduce() 多种用法
reduce()方法用于将数组简化为单一值,通过遍历数组并应用提供的函数.它可以用于求和.乘积.计算对象属性的总和.数组去重和转换数组结构等.初始值的设置会影响reduce的起始索引.不提供初始值时, ...
- 1. 从0开始学ARM-安装Keil MDK uVision集成开发环境
关于ARM的一些基本概念,大家可以参考我之前的文章: <到底什么是Cortex.ARMv8.arm架构.ARM指令集.soc?一文帮你梳理基础概念[科普]> 0. 如何学习arm? ARM ...
- B2B进销存ERP后台管理系统的逻辑架构与设计,AxureRP原型产品经理实战案例
模块分析: 进销存系统是一种用于企业管理库存.销售和采购活动的信息系统.它的主要作用包括但不限于以下几个方面: 1.库存管理 实时库存跟踪:准确记录每种商品的库存数量,确保数据的实时性和准确性. 库存 ...
- Typora 上传到 Github 实现笔记同步管理
首先在 Github 上 new 一个 repository ,我建的名称是 md_notes 然后在本地 terminal 中启动以下命令新建一个 ssh key ssh-keygen -o 生成 ...
- 用描述程序的方式emo,扎心了...
用描述程序的方式emo,扎心了... 众所周知写程序是个枯燥无聊的过程,再加上生活的不顺与坎坷,当程序语言与emo结合起来,看谁还说程序员不懂感情! 首当其冲的就是循环语句了 世界上最寂寞的感觉,是我 ...
- Transforms的使用
Transform的作用 把图片经过Transforms的一些函数之后就会对图片进行一些变化.比如,resize就是改变其大小,totensor就是把图片PIL或者numpy类型转化为Tensor类型 ...
- 小tips:微信小程序登录后返回登录前的页面继续操作(保留参数)
在app.js中添加如下两个方法即可: // 设置需要回调的地址 setCallbackUrl: function(mode) { return new Promise((resolve,reject ...
- 支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验
背景 在日常的购物转账.生活缴费等在线支付中,用户在正式拉起支付界面前,均需要至少经历一次"识别"+两次"寻找",即识别归属应用.寻找应用.寻找扫码入口,才能完 ...
- ASP.NET Core – Work with X509
前言 这篇主要是说如何用 ASP.NET Core 读写系统里的证书 Store 和创建一个证书, 还有使用证书做加密, 解密, 签名. 主要参考: C#数字证书编程总结 (读写证书 Store) E ...