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\_castconst\_castreinterpret\_cast的功能。

int *ip;
char *pc = (char*)ip; //作用同reinterpret_cast

所以追踪错误时会更加困难,不建议使用。

4-11.3 C++中的显式类转换的更多相关文章

  1. Spring装配bean(在java中进行显式配置)

    1.简单介绍 Spring提供了三种装配机制: 1.在XML中进行显式配置: 2.在java中进行显式配置: 3.隐式的bean发现机制和自动装配. 其中,1和3项在项目中经常使用,而在java中进行 ...

  2. C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数

    在早期的C++中.假设须要一些接受一些參数的构造函数,同一时候须要一个不接收不论什么參数的默认构造函数.就必须显示地编写空的默认构造函数.比如: //tc.h class A{ private: in ...

  3. TCP/IP网络中的显式拥塞通告(ECN)

    当前的TCP 实现将TCP 端节点之间的中间网络视为一个不透明的"黑盒".TCP 包进入和流出这个盒子.有些时候进入盒子的包被丢失了.因为今天的数字和光媒体上出现比特级错误的机会非 ...

  4. C++中的显式类型转化

    类型转化也许大家并不陌生,int i; float j; j = (float)i; i = (int)j; 像这样的显式转化其实很常见,强制类型转换可能会丢失部分数据,所以如果不加(int)做强制转 ...

  5. Java :构造器中的显式参数和this隐式参数

    1.构造器 写一个Java类,首先要先从构造器开始,构造器与类同名,在构造类的对象时会先从构造器开始. 构造器总是伴随着new操作符的执行而被调用. 构造器主要是用来初始化类的实例域. 构造器的特点: ...

  6. 【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 ...

  7. 008.在C#中,显式接口VS隐式接口

    原文http://www.codeproject.com/Articles/1000374/Explicit-Interface-VS-Implicit-Interface-in-Csharp (At ...

  8. selenium-webdriver中的显式等待与隐式等待

    在selenium-webdriver中等待的方式简单可以概括为三种: 1 导入time包,调用time.sleep()的方法传入时间,这种方式也叫强制等待,固定死等一个时间 2 隐式等待,直接调用i ...

  9. 深入js系列-类型(显式强制转换)

    什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...

  10. Golang 类型转换,断言和显式强制转换

    1 前言 类型转换,可以用断言(只能使用在interface{}类型转换成其它类型)和显式类型强制转换(常规是用于基本类型) 2 代码 //graphql-go func(params graphql ...

随机推荐

  1. 【牛客刷题】HJ15 求int型正整数在内存中存储时1的个数

    题目链接 题倒是很简单,最开始用了这么一种解法: package main import "fmt" func main() { a := 0 fmt.Scan(&a) s ...

  2. 9k star 监控系统,100% 国产,推荐了解

    前言 监控系统的重要性不言而喻,国内用的最多的应该是 Zabbix 和 Prometheus,其优缺点: Zabbix 是资产管理式,监控数据存在数据库中,擅长设备监控,不擅长微服务和云原生环境的监控 ...

  3. C# 将一个DataTable分解成多个DataTable

    今天在做项目时需要将一个DataTable分解成多个DataTable分批传入函数里面,于是在网上找寻了一番,修复了angle_greensky110  存在分表的缺陷的代码. 分表方法: /// & ...

  4. python 猜数字游戏(多版本)

    原始版本 print('------------------你是sb------------------') temp = input("不妨猜一下小甲鱼现在心里想的是哪个数字:" ...

  5. Chrome 浏览器插件获取网页 window 对象(方案三)

    前言 最近有个需求,是在浏览器插件中获取 window 对象下的某个数据,当时觉得很简单,和 document 一样,直接通过嵌入 content_scripts 直接获取,然后使用 sendMess ...

  6. WebGL 及其在 WebRTC 中的应用

    一.前言 1.什么是 WebGL ? WebGL 的全称是 Web Graphics Library,是一种 3D 绘图协议. WebGL 允许把 JavaScript 和 OpenGL ES 2.0 ...

  7. 【效果】使用canvas rotate实现一个旋转的矩形

    使用canvas rotate实现一个旋转的矩形,并且以矩形的中心为原点,围绕原点旋转: <canvas id="canvas" width="800" ...

  8. CSS & JS Effect – Tooltip

    介绍 Tooltip 长这样 它用 popup 的方式来详细描述一个主体. 比如某个 icon 代表着什么. 参考 YouTube – How To Make Tooltips With Only C ...

  9. 消毒 url 和 html (url encode and sanitizer html )

    更新: 2020-06-24 FromRoute vs FromQuery decode FromRoute 是不会 auto decode 的, query string 就会 这个是微软默认的设置 ...

  10. CSS – 网页设计 Web Design

    前言 Web Design 很广很深. 我记得许多年前第一次想介入设计工作 (我是后端工程师), 我就上网搜索了一下. 就看见了乔布斯著名的一句话: Design is not just what i ...