c++的类型转换和IO流

类型转换和IO流

一、c语言的类型转换

int i = 1;
// 隐式类型转换,这些类型都是表示数据的大小,整型家族包括char相互转化是因为他们只是范围不一样,浮点数与整型支持是因为浮点数本质也是表示数据的大小,只是加了精度而已;
double d = i;
printf("%d, %.2f\n" , i, d);
int* p = &i;
// 显示的强制类型转换,基本上内置类型都支持显式类型转换,整型和指针是支持显式类型转换的,因为地址是编号是支持显式类型转换的;
int address = (int) p;
printf("%x, %d\n" , p, address);

c隐式类型转换:

​ 自定义类型基本上是不支持隐式类型转换的,但是c++98支持单参数的构造函数是支持隐式类型转换的,之后c++11支持了多参数的隐式类型转换;

​ 即想要支持隐式类型转换要有一定的关联度,内置类型之间也是支持隐式类型转换的,如果不想支持隐式类型转换,就要在构造函数之前用explict关键字修饰;

​ size_t 与int发生隐式类型转换可能会导致比较大小出现问题;

c强制类型转换:

​ 常变量是可以使用强制类型转换获得地址,然后修改的。编译器认为堆常变量类型转换是有风险的会做出优化,对于常变量没有去内存中去取,而是放到了寄存器中去,读取也是从寄存器中进行读取,vs2019将常变量用宏替换成常量实现;

​ 使用关键字volatile可以强制去内存中进行查找或者不能使用宏替换;

二、c++的强制类型转换

​ 标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast

​ static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换 ,即静态转换是相关类型的转换;

// 相关类型的转换
double d = 2.1;
int i = static_cast<int>(d);

​ reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型,即用重新解释转换是不相关类型的转换;

// 不相关类型的转换
int *p = &i;
int x = reinterpret_cast<int>(p);

​ const_cast最常用的用途就是删除变量的const属性,方便赋值;const转换是带有一定的风险的;

//去掉const属性
const int a = 10;
int b = static_cast<int>(a);

​ dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

​ 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)

​ 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的),如果父类指针/引用是指向子类对象的就可以转换成功,正常返回地址,是指向父类对象的就会失败,返回空指针,否则就会存在越界访问的问题;强烈建议:避免使用强制类型转换

三、RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别。

C++通过以下方式来支持RTTI:

typeid 运算符

dynamic_cast 运算符

decltype

四、c语言常见IO流

常见IO函数:

​ 对于键盘显示器,printf/scanf;

​ 对于文件,fprintf/fscanf;fwrite/fread,进行的是二进制的读写;fputs/fgets;

​ 对于字符串,sprintf/sscanf;

五、c++常见IO流

​ c++IO流真正的优势是支持自定义类型;

​ cout的本质就是将自定义类型的成员转换成字符串,然后载入控制台;

​ istream/ostream对象只支持用istream/ostream对象进行构造;

在这里插入图片描述

常见IO对象:

//支持下列操作即要实现自定义类型转换成内置类型,是因为c++98重载了operator!,c++11重载了operator bool
//c++98
bool operator!() const;
//c++11
//ios类实现的
operator void*() const;
explicit operator bool() const;//不允许隐式类型转换
string str;
while(cin>>str)
{cout<<str<<endl;
}

​ 如何实现自定义类型转换成内置类型或者自定义类型转自定义类型,使用operator 类型(),注意不需要写返回值;

class A
{
public:operator int(){return a_;}
private:int a_ = 0;
};
//istream使用了流标志ctrl+z会被识别成结束

六、c++文件流

​ 头文件fstream,支持使用string对象进行构造;

​ 如下是枚举常量,表示打开的方式;

在这里插入图片描述

open()
close()
write()//以二进制的方式写,要注意读写是要使用字符数组,因为string内部是一个指向堆空间的指针,也就是说发送的是一个地址(野指针),且是上一个进程的
ofs<<str;//以文本方式写,直接使用流插入实现重载operator<<实现,ofstream继承了ostream可以直接使用ostream的运算符重载;要注意用空格隔开,因为读取默认以空格或者换行分割;
get()//读取字符
getline()//读取一行
ignore()//到达某个位置或者文件结尾就停止读取

七、c++字符流

​ 使用不同的类型进行存储是为了除了便于描述之外更重要的是为了支持运算;

​ 头文件sstream;

​ 支持使用string对象进行构造;

​ 要对stringstream对象多次转换时要clear并且str(“”),将状态clear成good,然后将缓冲区的空间str(“”)清理干净;

//直接初始化一个对象,然后直接流插入,然后使用str这个函数拿到字符串
A a;
ostringstream oss;
oss << a;
cout << oss.str();
A a;
istringstream iss(string("3 4 5"));
iss >> a;
cout << a;

​ 字符流常用于序列化和反序列化;

​ 1.stringstream实际是在其底层维护了一个string类型的对象用来保存结果。

​ 2.多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将

stringstream底层的string对象清空。

​ 3.可以使用s. str(“”)方法将底层string对象设置为""空字符串。

​ 4.可以使用s.str()将让stringstream返回其底层的string对象。

​ 5.stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参

数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更

安全。

八、序列化和反序列化

​ 序列化:将数据换换成字符串;反序列化:按需将字符串转换成不同类型的数据;由于数据库、网络中很多数据是不

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode-server的搭建方法

一、配置服务器端口支持 1、开放端口&#xff1a; 2、关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service二、配置code-server到服务器上** 1、下载code-server-4.22.0-linux-amd64.tar.gz到本地&#xff08;可下载最新的版本&#xff09;&a…

多人语聊房社交APP开发需要有哪些功能呢?

随着移动互联网的快速发展&#xff0c;社交APP已经成为人们日常生活中不可或缺的一部分。而随着语音社交的兴起&#xff0c;多人语聊房社交APP也逐渐受到了用户的青睐。在开发多人语聊房社交APP时&#xff0c;需要具备一系列功能&#xff0c;以满足用户的需求并提供良好的使用体…

Linux的一些常用指令

一、文件中 r w x - 的含义 r&#xff08;read&#xff09;是只读权限&#xff0c; w&#xff08;write&#xff09;是写的权限&#xff0c; x&#xff08;execute&#xff09;是可执行权限&#xff0c; -是没有任何权限。 二、一些指令 # 解压压缩包 tar [-zxvf] 压缩包名…

知名Web3 风险投资公机构Hack VC 四位合伙人将亲临hack.summit()2024亚洲区块链开发者大会

2024-03-14 15:32:24 知名web3风险投资机构Hack VC的四位合伙人——Alex Pack、Ed Roman、Roshun Patel和Rodney Yesep将亲临hack.summit()2024亚洲区块链开发者大会&#xff0c;这一盛事将于2024年4月9日至10日在香港数码港举行。 此次大会由Hack VC主办&#xff0c;并得到Alt…

AI预测福彩3D第8弹【2024年3月14日预测--新算法重新开始计算第五次测试】

兄弟们&#xff0c;感觉要起飞了&#xff01;截止昨天&#xff0c;经过新修正的算法进行3D预测&#xff0c;已经连续3次命中7码了&#xff0c;甚至6码或5码就能命中&#xff01; 昨天的开奖是 3 4 9,我的预测结果可参加上一篇文章 继续乘胜追击&#xff0c;再接再厉&#xff0…

Linux-vim显示乱码

Linux运维工具-ywtool 目录 一.问题二.解决2.1 编辑VIM的配置文件2.2 添加以下内容 一.问题 用vim编辑的时候,中文显示乱码 二.解决 2.1 编辑VIM的配置文件 vim ~/.vimrc #如果这个文件不存在,创建一个即可2.2 添加以下内容 添加完成以后就不会在出现中文乱码了 set fil…

ECRS软件:通过视频分析实现精益生产的利器

在追求高效生产的现代工业体系中&#xff0c;精准的数据分析和科学的流程管理是企业不可或缺的核心竞争力。ECRS软件作为一款专业的工时分析工具&#xff0c;通过视频分析的方式&#xff0c;为企业的精益生产提供了有力支持。使用ECRS软件&#xff0c;企业只需完成三项基础操作…

spring-authorization-server如何通过JWK Set Endpoint来获取公钥并验签的

参考文档&#xff1a;spring-authorization-server【版本1.2.2】 问题 在spring-authorization-server官方文档中提供了JWK Set Endpoint相关介绍&#xff0c;此端点主要返回JWK Set &#xff0c;此JWK Set包含了授权服务提供的所有公钥集&#xff0c;具体可通过访问端点&…

纯血鸿蒙来画龙!基于HarmonyOS ArkTS来操作SVG图片

大家好&#xff0c;龙年报喜&#xff0c;大地回春&#xff0c;作为程序员&#xff0c;以代码之名&#xff0c;表达对于龙年的祝福。本节将演示如何在基于HarmonyOS ArkTS的Image组件来实现画一条中国龙&#xff0c;祝大家“码”上“鸿”福到&#xff01; 创建应用 选择空模板…

FreeRTOS 的任务创建和删除

任务创建是我们第一个要学习的 API 函数&#xff0c;同时它也是 FreeRTOS 众多 API 函数中最复杂的一个&#xff0c;但是没办法&#xff0c;这个函数是我们第一个要学习的&#xff0c;也是非常重要的。 那么来看一下咱们本节的主要内容有哪些&#xff1a; 首先我们来介绍一下…

4款实用性前端动画特效分享(附在线演示)

分享4款非常不错的项目动画特效 其中有jQuery特效、canvas特效、CSS动画等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 全屏图片视差旋转切换特效 基于anime.js制作全屏响应式的图片元素布局&#xff0c;通过左…

Linux系统部署Swagger Editor结合内网穿透实现公网管理本地接口文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xf…

一种基于宏和serde_json实现的rust web中统一返回类

本人rust萌新&#xff0c;写web碰到了这个&#xff0c;基于ChatGPT和文心一言学了宏&#xff0c;强行把这玩意实现出来了&#xff0c;做个学习记录&#xff0c;如果有更好的方法&#xff0c;勿喷。 先看效果&#xff0c;注意不支持嵌套&#xff0c;且kv映射要用>(因为它这个…

Hadoop大数据应用:Yarn 节点实现扩容与缩容

目录 一、实验 1.环境 2.Yarn 节点扩容 3.Yarn 节点缩容 二、问题 1.yarn启动服务报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&…

力扣● 392.判断子序列 ● 115.不同的子序列

● 392.判断子序列 可以直接使用双指针的方法&#xff0c;2个指针分别从s、t开头出发&#xff0c;时间复杂度为O(t.size())。 但是这里用动规来做。Carl&#xff1a;掌握本题的动态规划解法是对后面要讲解的编辑距离的题目打下基础。 so绕一下&#xff0c;用昨天的● 1143.最…

直排开料机:木工行业的效率革命者

在木工行业中&#xff0c;开料机作为关键的生产设备&#xff0c;其选择直接关系到生产效率和产品质量。近年来&#xff0c;直排开料机以其独特的优势逐渐崭露头角&#xff0c;成为了众多企业的首选。那么&#xff0c;直排开料机究竟有哪些令人瞩目的优势呢&#xff1f; 一、高…

CrossOver24软件免费电脑虚拟机,快速在Mac和Linux上运行Windows软件

当然&#xff0c;除了之前提到的核心技术、兼容性和性能优化外&#xff0c;CrossOver2024还具有其他一些值得关注的性能特点&#xff1a; CrossOver Mac-安装包下载如下&#xff1a;https://wm.makeding.com/iclk/?zoneid50028 CrossOver linux-安装包下载如下&#xff1a;ht…

Spring Cloud Alibab 入门搭建,包含Nacos中心,注册服务发现服务,Feign请求,GateWay网关,sentinel限流

一、安装Nacos注册中心 1.1查看Nacos官网&#xff0c;安装Nacos服务&#xff0c;下载源码或者安装包 1.2启动服务&#xff0c;默认端口为8848&#xff0c; 二、创建服务注册&发现 2.1使用脚手架&#xff0c;创建注册服务和发现服务项目&#xff0c;我用的版本是2.6.13&…

mavros话题订阅后无法触发回调

前提 使用树莓派与pixhawk通信&#xff0c;安装好mavros&#xff0c;树莓派与pixhawk串口连接 启动节点mavros节点后&#xff0c;通过ros2 topic list可以查看到一系列话题 查看话题的类型可以去wiki mavros中查看 或者使用ros2 topic info 话题名称可以查看到 问题描述 订阅…

没有硬件基础可以学单片机吗?

没有硬件基础可以学单片机吗&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己&#xff0c…