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 ...
随机推荐
- 将整个工程的GBK转为utf-8格式
eclipse将整个工程转为utf-8时原先中文注释会变为乱码,13年时写了个脚本将整个文件的java以及配置文件转为utf-8格式,下面是代码 package com.code.pd; import ...
- docker部署宝塔面板
环境准备: 系统 rocky:9.2 部署流程: 1.安装docker dnf -y install yum-utils yum-config-manager --add-repo http://mi ...
- Clion+OpenCV(C++版)开发环境配置教程WinMac
Clion+OpenCV(C++版)开发环境配置教程Win/Mac 平时在学习和比赛的时候都是使用的Python版本的OpenCV,最近遇到了一个项目使用的上位机性能有限于是决定视觉方面使用C++的O ...
- 【YashanDB数据库】YAS-02079 archive log mode must be enabled when database is in replication mode
[标题]错误码处理 [问题分类]调整归档 [关键字]关闭归档.YAS-02079.replication mode [问题描述]执行alter database noarchivelog 关闭归档时, ...
- 使用Joi 完成JavaScript 数据校验
无论是在前端还是后端(Node.js),数据校验都是一件不可或缺的事情,使用JOI让我们轻松的完成数据校验 > npm install joi 这里持续记录使用心得 版本:17.4.2 官网:h ...
- 浅谈 C# 中的顶级语句
前言 在C# 9版本中引入了一项新特性:顶级语句,这一特性允许在不显式定义 Main 方法的情况下直接编写代码. 传统的写法 namespace TestStatements{ internal ...
- 深入理解Java对象结构
一.Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头.对象体和对齐字节,具体下图所示 1.Java对象的三部分 (1 ...
- Java以封装对象的方式读取CSV文件存储数据库
依赖 <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv --> <dependency& ...
- win10安装linux的gcc
mysy2下载gcc 过程比较艰苦,2024年秋冬讲课,被linux毒打了3天 pacman -S mingw-w64-ucrt-x86_64-gcc 这个一次成功,不行继续接大招 实在不行安装 ...
- 《Neo4j 图数据库扩展指南:APOC和ALGO》
https://detail.tmall.com/item.htm?spm=a2e2i.11532906.0.d2960ced2.f27a6abbrEMtHp&id=622478213458 ...