【C++】类型转换和IO流
目录
C语言中的类型转换
C++ eplicit && volatitle
eplicit
volatile
C++强制类型转换
static_cast(相关类型)
reinterpret_cast(不相关类型)
const_cast(去掉const属性)
dynamic_cast
RTTI(了解)
IO流
C语言中的类型转换
- 隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败
- 显式类型转换:需要用户自己处理。
void Test ()
{int i = 1 ;// 隐式类型转换double d = i ;printf ( "%d, %.2f\n" , i , d );int* p = & i ;// 显示的强制类型转换int address = ( int ) p ;printf ( "%x, %d\n" , p , address );}
缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。
C++ eplicit && volatitle
eplicit
自定义类型之间只要构造函数里面有联系也可以进行类型转换
#include <iostream>
using namespace std;
class A
{
public:
A(int a)
:_a(a)
{}
private:
int _a;
};class B
{
public:
B(const A& a)
{}
private:
//……
};int main()
{
A a1(1);
B b1 = a1;
return 0;
}
如果不想这个转换发生可以在B 的构造函数前面加 explicit 关键字
class B
{
public:
explicit B(const A& a)
{}
private:
//……
};
volatile
//这个n为常变量,不是常量,不能直接修改,但是可以通过类型转换间接修改
const int n = 10;
//去掉const 属性后,常变量就可以修改
int* p = (int*)&n;
(*p)++;//监视窗口中n已经变成11,但是打印为10
//原因是编译器的优化,去掉const 属性是有风险的,因此编译器所作的优化是在取n的值的
//时候没有从内存里取,而是从寄存器里取,有些编译器编译的时候会将const变量都替换成
//常量
cout << n << endl; //10
cout << *p << endl; //11//要解决上述情况,需要引入 volatile 关键字
//该关键字的作用是告诉编译器每次都去内存中取值
volatile const int n = 10;
C++强制类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast 、reinterpret_cast、const_cast、dynamic_case
static_cast(相关类型)
int main (){double d = 12.34 ;int a = static_cast < int > ( d );cout << a << endl ;return 0 ;}
reinterpret_cast(不相关类型)
int main (){double d = 12.34 ;int a = static_cast < int > ( d );cout << a << endl ;// 这里使用 static_cast 会报错,应该使用 reinterpret_cast//int *p = static_cast<int*>(a);int * p = reinterpret_cast < int* > ( a );return 0 ;}
const_cast(去掉const属性)
void Test (){volatile const int a = 2 ;int* p = const_cast < int* > ( & a );* p = 3 ;cout << a << endl ;}
dynamic_cast
- 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
- 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
- dynamic_cast只能用于父类含有虚函数的类
- dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
class A{public :virtual void f (){}};class B : public A{};void fun ( A * pa ){// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B * pb1 = static_cast < B *> ( pa );B * pb2 = dynamic_cast < B *> ( pa );cout << "pb1:" << pb1 << endl ;cout << "pb2:" << pb2 << endl ;}int main (){A a ;B b ;fun ( & a );fun ( & b );return 0 ;}
RTTI(了解)
- typeid运算符
- dynamic_cast运算符
- decltype
IO流

c++中自定义类型中重载流插入和流提取,方法如下示例:
class Date{friend ostream & operator << ( ostream & out , const Date & d );friend istream & operator >> ( istream & in , Date & d );public :Date ( int year = 1 , int month = 1 , int day = 1 ): _year ( year ), _month ( month ), _day ( day ){}operator bool (){// 这里是随意写的,假设输入 _year 为 0 ,则结束if ( _year == 0 )return false ;elsereturn true ;}private :int _year ;int _month ;int _day ;};istream & operator >> ( istream & in , Date & d ){in >> d . _year >> d . _month >> d . _day ;return in ;}ostream & operator << ( ostream & out , const Date & d ){out << d . _year << " " << d . _month << " " << d . _day ;return out ;}// C++ IO 流,使用面向对象 + 运算符重载的方式// 能更好的兼容自定义类型,流插入和流提取int main (){// 自动识别类型的本质 -- 函数重载// 内置类型可以直接使用 -- 因为库里面 ostream 类型已经实现了int i = 1 ;double j = 2.2 ;cout << i << endl ;cout << j << endl ;// 自定义类型则需要我们自己重载 << 和 >>Date d ( 2022 , 4 , 10 );cout << d ;while ( d ){cin >> d ;cout << d ;}return 0 ;}
C++文件IO流
struct ServerInfo{char _address [ 32 ];int _port ;Date _date ;};struct ConfigManager{public :ConfigManager ( const char* filename ): _filename ( filename ){}void WriteBin ( const ServerInfo & info ){ofstream ofs ( _filename , ios_base::out | ios_base::binary );ofs . write (( const char* ) & info , sizeof ( info ));}void ReadBin ( ServerInfo & info ){ifstream ifs ( _filename , ios_base::in | ios_base::binary );ifs . read (( char* ) & info , sizeof ( info ));}// C++ 文件流的优势就是可以对内置类型和自定义类型,都使用// 一样的方式,去流插入和流提取数据// 当然这里自定义类型 Date 需要重载 >> 和 <<// istream& operator >> (istream& in, Date& d)// ostream& operator << (ostream& out, const Date& d)void WriteText ( const ServerInfo & info ){ofstream ofs ( _filename );ofs << info . _address << " " << info . _port << " " << info . _date ;}void ReadText ( ServerInfo & info ){ifstream ifs ( _filename );ifs >> info . _address >> info . _port >> info . _date ;}private :string _filename ; // 配置文件};int main (){ServerInfo winfo = { "192.0.0.1" , 80 , { 2022 , 4 , 10 } };// 二进制读写ConfigManager cf_bin ( "test.bin" );cf_bin . WriteBin ( winfo );ServerInfo rbinfo ;cf_bin . ReadBin ( rbinfo );cout << rbinfo . _address << " " << rbinfo . _port << " " << rbinfo . _date << endl ;// 文本读写ConfigManager cf_text ( "test.text" );cf_text . WriteText ( winfo );ServerInfo rtinfo ;cf_text . ReadText ( rtinfo );cout << rtinfo . _address << " " << rtinfo . _port << " " <<rtinfo . _date << endl ;return 0 ;}
下面我们cin常用来读取数据直到输入结束,本质就是重载类型
#include <iostream>
using namespace std;
int main()
{
int num;// while(cin>>a>>b) cin.operator>>(a).operator>>(b).operator bool()
while (cin >> num) //operator >>(cin,str). operator bool()
{
//……
}
return 0;
}
自定义类型 和 内置类型相互转换
#include <iostream>
using namespace std;
class A
{
public:
A(int a)
:_a(a)
{}//内置类型 <- 自定义类型
operator int ()
{
return _a;
}
private:
int _a;
};int main()
{//自定义类型 <- 内置类型
A a = 1;//内置类型 <- 自定义类型,需要重载类型
int num = a;
return 0;
}
相关文章:
【C++】类型转换和IO流
目录 C语言中的类型转换 C eplicit && volatitle eplicit volatile C强制类型转换 static_cast(相关类型) reinterpret_cast(不相关类型) const_cast(去掉const属性) dynamic_cast RTTI(了解) IO流 …...
leetCode刷题 5.最长回文子串
目录 1. 思路 2. 解题方法 3. 复杂度 4. Code 题目: 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出&#x…...
计算机组成原理面试题
计算机组成原理是计算机科学的基础课程之一,涉及计算机系统的基本结构和工作原理。以下是一些可能出现在面试中的计算机组成原理相关题目: 1. **什么是冯诺依曼体系结构?** - 冯诺依曼体系结构是一种计算机组织架构,它将程序指…...
「Mybatis深入三」:高级查询-模糊查询
一、需求 根据username 模糊查询user 表 二、代码演示 1、方式1 数据库环境 CREATE DATABASE mybatis_db; USE mybatis_db; CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(32) NOT NULL COMMENT 用户名称,birthday DATETIME DEFAULT NULL COMMEN…...
LabVIEW管道缺陷智能检测系统
LabVIEW管道缺陷智能检测系统 管道作为一种重要的输送手段,其安全运行状态对生产生活至关重要。然而,随着时间的推移和环境的影响,管道可能会出现老化、锈蚀、裂缝等多种缺陷,这些缺陷若不及时发现和处理,将严重威胁到…...
java在cmd中乱码的问题解决
本文深入探讨了在使用 Java 命令行(cmd)时可能出现的中文乱码问题,并提供了两种解决方案。首先,通过临时的方式,用户可以执行命令 chcp 936 选择字符集,然后再运行 Java 命令,确保在选择字符集过…...
OpenHarmony教程指南—ArkUI中组件、通用、动画、全局方法的集合
介绍 本示例为ArkUI中组件、通用、动画、全局方法的集合。 本示例使用 Tabs容器组件搭建整体应用框架,每个 TabContent内容视图 使用 div容器组件 嵌套布局,在每个 div 中使用 循环渲染 加载此分类下分类导航数据,底部导航菜单使用 TabCont…...
第二证券|金价逼近历史高点 黄金股价值有望重估
经过两个多月的震荡后,黄金打响新一波攻势,期货商场价格已逼近前史高点。 有分析认为,虽然黄金价格短期已有显着涨幅,存在震荡或许,但中长时间看,跟着美联储钱银政策的转向,黄金价格仍有上行动…...
关于51单片机晶振定时问题
单片机中晶振频率为12MHZ的机器周期怎么算? 1、系统晶振频率是12M,则机器周期=12/12=1us; 2、定时1ms=1*1000=1000us; 3、工作在方式1下:最大计数值是2&a…...
NoSQL--2.MongoDB配置(Windows版)
目录 2.MongdoDB配置 2.1 Windows环境下操作 2.1.1 注册MongDB Atlas: 2.1.2 MongoDB Community Server Download: 2.1.3 启动MondgoDB服务: 2.1.3.1 命令行参数的方式启动MongoDB服务: 2.1.3.2 使用配置文件方式启动Mongo…...
HTML静态网页成品作业(HTML+CSS)——安徽宣笔设计制作(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有6个页面。 🏷️想要…...
MySQL CTEs通用表表达式:进阶学习-递归查询
MySQL CTEs通用表表达式:进阶学习-递归查询 递归通用表表达式是其会引用自身的通用表表达式。 CTEs 递归通用表表达式补上了MySQL8之前无法使用递归查询的空白。在之前,递归查询需要使用函数等方法实现。 基础使用,请参考前文: …...
[Java安全入门]二.序列化与反序列化
一.概念 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。将程序中的对象,放入文件中保存就是序列化,将文件中的字节码重新转成对象就是反…...
Dutree:Linux 文件系统磁盘使用追踪工具
在 Linux 系统中,对文件系统的磁盘使用情况进行跟踪和管理是至关重要的。dutree 是一个功能强大的工具,它能够以可视化的方式展示文件系统中的目录和文件的大小,帮助用户更好地了解磁盘空间的使用情况。本文将介绍 dutree 工具的使用方法、功…...
http和https的区别是什么?
–前言 传输信息安全性不同、连接方式不同、端口不同、证书申请方式不同 一、传输信息安全性不同 1、http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。 2、h…...
学习Android的第十九天
目录 Android ExpandableListView 分组列表 ExpandableListView 属性 ExpandableListView 事件 ExpandableListView 的 Adapter 范例 参考文档 Android ViewFlipper 翻转视图 ViewFlipper 属性 ViewFlipper 方法 为 ViewFlipper 加入 View 例子:全屏幕可…...
C#上位机调试经验
1.使用Visual Studio的远程工具 因为上位机软件安装在工控机上,不方便调试。如果直接把代码放在工控机上,又不太安全。 可以在工控机上安装一个Visual Studio的远程工具,把随身带的笔记本电脑通过网线插在工控机上 这样可以在笔记本上使用…...
BUUCTF---[极客大挑战 2019]BabySQL1
1.这道题和之前做的几道题是相似的,这道题考的知识点更多。难度也比之前的大一些 2.尝试万能密码 or 1#发现过滤了or,使用1和1,发现他对单引号也进行了过滤。于是我尝试进行双写绕过,发现可以通过了。 3.由之前的做题经验可知,这道题会涉及到…...
0基础跨考计算机|408保姆级全年计划
我也是零基础备考408! 虽说是计算机专业,但是本科一学期学十几门,真的期末考试完脑子里什么都不进的...基本都是考前一周发疯学完水过考试...😅 想要零基础跨考可以直接从王道开始!跟教材一点一点啃完全没必要🥸 现在…...
C# 操作LiteDB
1、很简单的东西不废话,直接上图上代码。 2、NuGet程序中根据自己的项目版本安装LiteDB,如下图: 3、程序运行加过如下图: 4、程序代码如下: using System; using System.Collections.Generic; using System.Linq; using System…...
快速部署DDColor:本地环境搭建与老照片修复完整流程
快速部署DDColor:本地环境搭建与老照片修复完整流程 1. 引言:让黑白记忆重获新生 在数字影像技术高度发达的今天,我们随手就能拍摄高清彩色照片。但那些承载着家族记忆和历史瞬间的黑白老照片,却因为技术限制而失去了色彩的温度…...
正则表达式实战:精准校验日期时间格式的五大场景
1. 为什么我们需要校验日期时间格式? 在日常开发中,数据校验是最基础也最容易出问题的一环。就拿日期时间来说,你可能遇到过用户把"2023年2月30日"这种不存在的日期提交到系统,或者日志文件里的时间戳格式五花八门&…...
从《数据结构》到《Web技术》:我是如何用这些课程项目打造个人技术栈的?
从《数据结构》到《Web技术》:我是如何用课程项目构建技术栈的? 记得大二那年,当我盯着《数据结构》教材里的栈和队列概念发呆时,完全没意识到这些抽象理论会在两年后成为我开发景区管理系统的核心算法。计算机专业的课程就像散落…...
FlowState Lab快速部署指南:3分钟搭建你的预测工作站
FlowState Lab快速部署指南:3分钟搭建你的预测工作站 1. 环境准备与快速部署 1.1 系统要求 操作系统:Ubuntu 20.04/22.04或CentOS 8显卡:NVIDIA GPU(建议RTX 3060及以上)内存:16GB及以上存储:…...
别再只会用ST-Link了!手把手教你用串口给STM32F103C8T6远程更新固件(IAP实战)
突破有线束缚:基于串口的STM32F103C8T6固件无线更新实战指南 当你的STM32开发板被嵌入产品外壳深处,当生产线上的设备需要批量升级,当野外部署的传感器需要修复漏洞——传统ST-Link烧录方式立刻显得笨拙不堪。本文将揭示如何仅用5元的USB转TT…...
保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG)
保姆级图解:FD-SOI工艺流程中的关键三步(外延生长、应变硅、HKMG) 在智能手机处理器和自动驾驶芯片的制造中,FD-SOI技术正凭借其独特的性能优势成为行业焦点。这项技术通过超薄绝缘层上硅(Ultra-Thin Body and Buried…...
天硕(TOPSSD)深度解析:存储介质分类视角下,SSD固态硬盘如何一步步演进?
在信息技术持续迭代的背景下,存储介质的选择已不再局限于容量与成本,而逐渐成为决定系统性能上限、响应延迟与长期稳定性的关键因素。从光学存储到机械硬盘(HDD),再到以半导体技术为核心的SSD固态硬盘,每一…...
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告 1. DeerFlow简介:您的智能研究助手 DeerFlow是一款由字节跳动开源的深度研究自动化工具,它整合了语言模型、网络搜索和代码执行能力,能够快速完成复杂的研究任务。这个工具…...
Anything V5镜像实战:从部署到生成你的第一张二次元头像
Anything V5镜像实战:从部署到生成你的第一张二次元头像 1. 项目介绍与核心价值 Anything V5是基于Stable Diffusion技术优化的高质量二次元图像生成模型。相比通用版本,它特别擅长生成动漫风格的人物肖像、场景插画等作品,在细节表现和风格…...
Qwen2.5-VL-3B视频识别实战:从环境搭建到显存优化的踩坑记录
Qwen2.5-VL-3B视频识别实战:从环境搭建到显存优化的全流程指南 当开发者第一次尝试用Qwen2.5-VL-3B处理视频内容时,往往会遇到各种预料之外的挑战。从依赖包缺失到显存爆炸,从环境配置到参数调试,每一步都可能成为阻碍项目推进的绊…...
