学习->C++篇十七:C++的类型转换和IO流

news2025/1/23 23:10:58

目录

一.类型转换

1.C语言中的类型转换

2.C++中的类型转换

二.IO流

1. C语言的输入与输出

2. 流是什么

3. stringstream


一.类型转换

1.C语言中的类型转换

(1)隐式类型转换,编译阶段自动进行,不能转换就编译报错。(相关类型)

(2)强制类型转换,用户自行检查

例如:

缺点:转换的可读性差,显式类型转换的转换形式都相同,难以跟踪转换错误,隐式类型转换可能有精度丢失的问题。 

2.C++中的类型转换

为解决C语言类型转换的可读性,安全性的缺点,C++引入了四种命名的强制类型转换操作符。

(1)static_cast

用于相关类型之间的类型转换,非多态类型的转换,编译器执行的隐式类型转换都可以用static_cast,不相关的类型会编译报错,用法:

(2)reinterpret_cast

用于不相关类型的转换,例如上述的int类型的a转换为int*:

(3)const_cast

用于删除变量的const属性(const——cast中的类型必须是指针或引用):

这里两次打印出的a都是100,因为const常量取数据时被编译器优化了,没有到内存中取数据,而是优化到了寄存器,要防止这种优化,将变量用volatile关键字修饰,让每一次取数据a时,都强制到内存读取。例如:

 

(4)dynamic_cast

用于动态转换的向下转型。

向上转型:将子类指针或引用转换为父类指针或引用(安全的转换,赋值兼容,编译器原生支持)

向下转换:将父类指针或引用转换为子类指针或引用(不安全的转型,需用dynamic_cast)

注意:

1.dynamic_cast只能用于父类含有虚函数的类。

2.dynamic_cast 会先检查是否能转型成功,能转型成功就转换,反之返回0

例如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using std::cout;
using std::endl;

class base
{
public:
	virtual void fun(){}
};

class derive:public base
{

};

void fun(base* b)
{
	derive* p1 = static_cast<derive*>(b);
	derive* p2 = dynamic_cast<derive*>(b);
	cout << p1 << endl;
	cout << p2 << endl << endl;
}
int main()
{
	base b;
	derive d;
	fun(&b);
	fun(&d);
	
	return 0;
}

输出:

 可见static_cast没有类型安全检查,而dynamic_cast有。

注意:dynamic_cast 是C++一种运行时类型识别的机制,即RTTI:Run-time Type identifification,还有两种方式,一种是typeid,一种是decltype。

二.IO流

1. C语言的输入与输出

C语言的常用输入和输出方式是scanf和printf,scanf:从标准输入( 键盘)中读取数据到变量中,
printf:将变量的值打印输出到标准输出(屏幕)中。C语言通过C语言提供的缓冲区来对输入和输出进行缓冲。
如图:
  缓冲区的作用
1.屏蔽掉低级IO的实现(封装系统调用),使代码可移植性更强。
2.使这部分的内容实现"行"读取的行为(C语言封装的)。

2. 流是什么

流:物质从一处往另一处流动。( 有序连续方向性数据的抽象描述)
C++的IO流:
C++实现了IO库,其中ios为基类,其他类直接或间接派生自ios类。
如图:
C++标准库提供了4个全局流对象cin(标准输入)、cout(标准输出)、cerr(标准错误的输出)、clog(日志的输出)。
使用注意:

### cin为缓冲流,键盘输入的数据会保存在我们的缓冲区当中,当要提取的时候会从缓冲区去拿。读取到回车的时候会刷新缓冲区。

### 空格和回车都作为数据之间的分隔符。

### cin和cout可以直接输入和输出所有内置类型,因为标准库已经全部重载了内置类型的输入输出函数。

### 对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<或>>进行重载。

### istream类型对象转换为逻辑条件判断值。- 类似于运算符重载。比如 while(cin>>i){}

### VS编译器下输入ctrl+z表示输入结束即eof

C++的文件IO流:

### 文件内容的数据格式有二进制文件和文本文件

### 文件流对象操作文件的步骤

- 定义文件流对象

- 使用对象成员函数打开磁盘文件

- 对文件进行读写操作或使用成员函数读写操作

- 关闭文件

使用示例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<fstream>
using namespace std;

int main() 
{
	/*ifstream ifile(只输入用)
	ofstream ofile(只输出用)
	fstream iofile(既输入又输出用)*/
	string str = "hello world ,123456\n";
	ofstream ofs("text.txt");
	ofs << str;
	ofs.close();
 	return 0;
}

于是可以打开text.txt文件看到

 

3. stringstream

序列化与反序列化:
    将整形数据类型转换成字符串的数据类型的过程叫做序列化,反之叫做反序列化。

C与C++:
    在c语言中可以用这个itoa函数或者用sprintf函数进行转化
    在c++中可以使用stringstrem类对象进行转化

测试代码:

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int main()
{
	int num1 = 127863;
	string str;
	stringstream trans;
	trans << num1;
	trans >> str;
	cout << str << endl;

	//如果要进行多次转化需要用clear函数清空trans内部上次的转换状态
	trans.clear();
	double num2 = 898.19;
	trans << num2;
	trans >> str;
	cout << str << endl;

    //trans.str(""); 将底层string对象设置为""空字符串
	string s = trans.str();//返回trans对象中管理的string
	cout << s << endl;
	return 0;
}

输出:

 总结:

stringstream在其底层维护了一个string类型的对象用来保存结果。
多次数据类型转化时,需用clear()来清空,但clear()不会将 stringstream底层的string对象清空。
可使用s. str("")方法将底层string对象设置为""空字符串。
可使用s.str()将让stringstream返回其底层的string对象。
stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,不用格式化控制stringstream使用更方便,更安全。

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

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

相关文章

TCP/IP四层协议

七层模型层数太多记不住&#xff0c;四层模型 应用层&#xff0c;传输层&#xff0c;网络层&#xff0c;网络接口层的名字必须记得滚瓜烂熟。&#xff08;重点也是tcp/ip四层模型&#xff09; 四层模型&#xff1a; 1.应用层&#xff1a; 两台终端设备上的应用程序 应该遵守…

三面美团 Java 岗,HR 现场直接发 offer,他是横着走出来的

前情提要 这是一个发生在我朋友身上的真实事情&#xff1a; 这里就叫他程序员 Y 吧。 程序员 Y 工作不到两年&#xff0c;周末在朋友圈发了个喜报&#xff0c;准备入职美团。 之后&#xff0c;我就带着祝福跟 Y 聊了许久&#xff0c;聊天的内容就是具体了解一下他面试的过程…

技术分享之IntelliJ plugin

资料 https://zhaojian.blog.csdn.net/article/details/127882946 Plugin Configuration File https://plugins.jetbrains.com/docs/intellij/plugin-configuration-file.html 今天分享的主要内容: 了解插件能够做什么 如何开发一个插件 阅读两个常用的插件源码 intellij的窗…

15.Django大型电商项目之创建模型与sql表反向生成模型

1.用户模块模型类创建 1.1 创建用户的子应用 python .\manage.py startapp userapp在settings中挂载子应用 创建子应用urls.py 在主应用中加入子应用的urls.py 1.2 创建表 如何在直接导入sql文件形成表&#xff0c;这里就直接在navicate中把sql文件拖进去点击开始即可 这里…

大数据技术系列:图解大数据平台开发

导言 在前面的文章《「大数据技术体系」学习实践导览》中&#xff0c;概要式的梳理了大数据平台的业务目标&#xff0c;大数据平台的架构框架&#xff0c;大数据平台中常用的技术及工具&#xff0c;数据治理四方面的内容&#xff0c;算是对自身所了解大数据知识体系的抛砖引玉…

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素)

第十四届蓝桥杯集训——JavaC组第十二篇——while循环(循环四要素) 前言 百度解析&#xff1a;以环形、回路或轨道运行;沿曲折的路线运行;特指运行一周而回到原处,再转。或说反复地连续做某事。 那么&#xff0c;在程序中依然是连续重复的按照一定的规则去执行某事。 程序计数器…

如何把视频分屏?教你轻松学会视频分屏

分屏视频该怎么操作&#xff1f;不知道大家有没有看到过这样一个视频&#xff0c;就是一个视频里有两个或者有更多个画面&#xff0c;我们在观看的时候可以同时看好几个画面。其实这就是分屏视频&#xff0c;在一个页面中加入多个画面。这样的视频是不是既好玩又炫酷呢&#xf…

尚硅谷Promise笔记

文章目录一、Promise介绍与基本使用1-1.初体验之promise封装ajax请求1-2.Promise对象状态属性PromiseState的值有三个1-3.Promise对象状态属性PromiseResults二、Promise API2-1.Promise构造函数Promise(excutor){}2-2.Promise.prototype.then 方式&#xff1a;(onResolved,onR…

App 黑白化技术实践

前言 很高兴遇见你~ 最近打开各大 App 会发现它们都做了黑白化&#xff0c;如下支付宝的处理&#xff1a; 可以看到应用设置了全局灰色调&#xff0c;表达了一种对逝者的哀悼&#xff0c;非常的应景和人性化。作为程序猿&#xff0c;我们来探索一下它从技术角度是怎么实现的。…

[附源码]Python计算机毕业设计SSM基于java旅游信息分享网站(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

汇编语言第2章—寄存器

8086CPU有14个寄存器&#xff0c;分别是&#xff1a;AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。2.1 通用寄存器 8086CPU的所有寄存器都是16位的&#xff0c;可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据&#xff0c;称为通用…

【Spring】AOP记录日志

我的aop记录日志&#xff0c;可以记录&#xff1a;【 操作类型、操作描述、参数、登录项目的用户ip】 当然记录什么靠你自己决定。 一.自定义一个注解 Target({ElementType.METHOD,ElementType.PARAMETER}) Retention(RetentionPolicy.RUNTIME) Documented public interface A…

两位前阿里 P10 的成长经历的启发

目录 汤峥嵘的成长经历 关键节点一&#xff1a;到美国留学 关键节点二&#xff1a;美国工作十年 关键节点三&#xff1a;八年阿里时光 关键节点四&#xff1a;加入途牛和 VIPABC 毕玄的成长经历 关键节点一&#xff1a;小公司里脱颖而出 关键节点二&#xff1a;加入淘宝…

FineReport数据分析教程- 图表刷新接口

1. 概述 1.1 预期效果 点击按钮可以刷新普通报表或决策报表中的图表&#xff0c;以普通报表为例&#xff0c;效果如下图所示&#xff1a; 1.2 实现思路 通过FR.Chart.WebUtils.getChart("chartID").dataRefresh()获取要刷新的图表对象&#xff0c;其中chartID为图表…

程序员如何写一份更好的简历

简历中的常见错误 1. 信息过多&#xff0c;缺乏重点 信息过多的常见表现是十几行的技能列表&#xff0c; 我举一个血淋淋的例子&#xff1a; 20 行的技能列表&#xff0c;这位求职者开始就把自己了解的所有工具都列出来&#xff0c;希望能够突显自己的经验和学习能力&#xf…

pytorch基础操作(五)多层感知机的实现

1、多层感知机 1、激活函数的引入 这个多层感知机有4个输⼊&#xff0c;3个输出&#xff0c;其隐藏层包含5个隐藏单元。输⼊层不涉及任何计算&#xff0c;因此使⽤此⽹络产⽣输出只需要实现隐藏层和输出层的计算。因此&#xff0c;这个多层感知机中的层数为2。注意&#xff0…

小米盒子为什么搜不到电视家?电视安装包解析错误解决方案

不少的朋友在小米电视盒子上安装了美家市场软件商店后&#xff0c;却发现在市场里面没法安装想要的电视盒子直播软件&#xff0c;这是怎么回事呢&#xff1f;其实大部分原因是电视盒子机制的问题限制了安装&#xff0c;导致部分品牌电视盒子装软件时会弹出“无法安装”的提示。…

Mysql双主整理

目录 1. Mysql binlog参数配置 2. Mysql binlog查看详细内容 3. Mysql双主搭建 4. Mysql双主解决数据回环 4.1 双主同步测试一 4.1.1 测试总结 4.2 双主同步测试二 4.2.1 测试总结 4.3 双主同步测试三 4.3.1 测试总结 1. Mysql binlog参数配置 log-binmysql-bin 打…

水果FLStudio21.0.0软件最新版有哪些新增功能变化?

FL Studio(水果软件)21 引入更快、更精确的音频编辑、改进的内容发现、对 DAW 情绪的控制以及更多鼓舞人心的创意工具。FL Studio是一款功能非常强大的音乐创作编辑软件它就是FL Studio(水果软件)。使用FL Studio中文版可以轻松帮我们制作自己的音乐唱片&#xff0c;拥有强大且…

【ROS】HelloWord简单实现

C实现 1. 创建工作空间并初始化 创建工作目录demo01_ws&#xff0c;并在该文件夹下创建src文件夹 mkdir -p demo01_ws/src进入到该目录下 cd demo01_ws/初始化 catkin_make这时在demo01_ws目录下除了src文件夹外&#xff0c;多处了两个文件夹。 ![在这里插入图片描述](htt…