c++(类型转换+IO)[30]

news2024/12/26 10:34:04

类型转换

意义相近的类型------隐式类型转换
意义不想近的类型,值转换后有意义------显示的强制类型转换

static_cast

任何隐式类型的转换,非多态类型的转换(静态转换),意义相近的转换。
用于常见的隐式类型转换,如数值类型之间的转换、指针和引用之间的转换,以及基类指针向派生类指针的转换。在进行转换时,static_cast会在编译时进行类型检查,如果转换是不安全的,会发出警告

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);
	cout << a << endl;

	return 0;
}

在这里插入图片描述

reinterpret_cast

不相关类型的转换
用于进行底层的类型转换,可以将一个指针或引用转换为其他类型的指针或引用,甚至可以将指针转换为整数类型。reinterpret_cast在进行转换时不会进行类型检查,因此需要谨慎使用,只在确保转换是安全的情况下使用。

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);
	cout << a << endl;

	int* p = &a;
	//不支持
	//int adress = static_cast<int>(p);
	int adress = reinterpret_cast<int>(p);

	return 0;
}

const_cast

用于去除const属性,可以将const指针或引用转换为非const指针或引用。const_cast只能用于修改指针或引用的const属性,而不能修改其他属性,如对象的值。使用const_cast需要注意,如果修改了原本被声明为const的对象,可能会导致未定义行为。

	const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;
	cout << *p << endl;

在这里插入图片描述
c++中const代表常变量,可以被间接修改。

监视窗口:
在这里插入图片描述
原因:编译器优化认为const不会被修改,将a加载到寄存器当中。读取a时去寄存器当中读。内存当中的a实际是被修改的

使用volatile关键字取消编译器优化

	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;  //3
	cout << *p << endl; //3

dynamic_cast

用于进行安全的向下转型,即将基类指针或引用转换为派生类指针或引用。dynamic_cast在进行转换时会进行运行时类型检查,如果转换不安全,会返回空指针或抛出std::bad_cast异常。dynamic_cast只能用于有继承关系的类之间进行转换。

当使用dynamic_cast进行向下转型时,如果基类没有声明任何虚函数,就无法使用dynamic_cast进行安全的转换,会导致编译错误。这是因为dynamic_cast在进行转换时需要运行时类型信息(RTTI)来判断是否可以进行转换,而运行时类型信息是通过虚函数表来实现的。

在没有虚函数的情况下,基类对象的指针或引用无法获取到运行时类型信息,因此dynamic_cast无法进行安全的转换。编译器会在这种情况下给出编译错误,提示无法进行转换。

要想使用dynamic_cast进行安全的向下转型,基类必须至少声明一个虚函数。这样,在派生类中重写了该虚函数后,dynamic_cast才能通过虚函数表获取到运行时类型信息,从而进行安全的转换。

总结起来,如果基类没有声明任何虚函数,dynamic_cast无法进行安全的向下转型,会导致编译错误。

在这里插入图片描述
父类指针指向子类,虽然可以通过强转成子类来访问子类对象,但是会越界风险
在这里插入图片描述
使用dynamic_cast:
在这里插入图片描述
在这里插入图片描述
上述代码若使用c语言的强转则会出现(父类-子类:子类-父类)全部转换成功,父类的指向子类则会出现越界。

class A
{
public:
	virtual void f(){}
};

class B : public A
{};

// RAII
// RTTI

void fun(A* pa, const string& s)
{
	cout <<"pa指向"<<s << endl;

	// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回
	B* pb1 = (B*)pa;			   // 不安全的
	B* pb2 = dynamic_cast<B*>(pa); // 安全的

	cout << "[强制转换]pb1:" << pb1 << endl;
	cout << "[dynamic_cast转换]pb2:" << pb2 << endl << endl;
}

int main()
{
	A a;
	B b;
	fun(&a, "指向父类对象");
	fun(&b, "指向子类对象");

	cout << typeid(a).name() << endl;
	decltype(a) aa;

	function<bool(int,int)> gt = [](int x, int y){return x > y; };
	set<int, decltype(gt)> s;

	return 0;
}

在这里插入图片描述

RTTI

RTTI(Run-Time Type Information,运行时类型信息)是C++中的一项特性,用于在运行时获取对象的类型信息。RTTI主要通过两个关键字来实现:dynamic_cast和typeid。

  1. dynamic_cast:dynamic_cast是一个类型转换操作符,用于进行安全的向下转型。它在进行转换时会进行运行时类型检查,如果转换不安全,会返回空指针或抛出std::bad_cast异常。dynamic_cast需要基类至少声明一个虚函数,通过虚函数表来获取对象的实际类型信息。

  2. typeid:typeid是一个运算符,用于获取对象的类型信息。它返回一个std::type_info对象,包含了对象的实际类型信息。可以使用typeid来比较两个对象的类型是否相同。

RTTI的主要应用场景是在面向对象的程序中,需要根据对象的实际类型进行动态的类型判断和类型转换。通过RTTI,可以在运行时获取对象的类型信息,从而实现多态性和动态绑定。

需要注意的是,RTTI的使用需要谨慎,因为它可能引入一些运行时开销,并且在某些情况下可能会导致设计上的问题。在一些情况下,可以通过使用虚函数和多态性来避免使用RTTI。

在这里插入图片描述

IO

在这里插入图片描述
在这里插入图片描述
分割输入字符:
在这里插入图片描述
在这里插入图片描述
Ctrl+z 加回车(隐式类型转换cin>>str为bool的false)结束此程序

自定义类型转换为内置类型

在C++中,可以通过重载类型转换运算符(type conversion operator)来实现自定义类型到内置类型的转换。类型转换运算符是一种特殊的成员函数,用于将一个类类型转换为另一个类型。

以下是一个示例,演示了如何将自定义的类类型转换为内置类型int:

class MyInt {
private:
  int value;
public:
  // 构造函数
  MyInt(int v) : value(v) {}

  // 类型转换运算符
  operator int() const {
    return value;
  }
};

int main() {
  MyInt myInt(42);
  int intValue = myInt; // 自动调用类型转换运算符将MyInt转换为int
  std::cout << intValue << std::endl; // 输出: 42
  return 0;
}

在上面的示例中,类MyInt定义了一个类型转换运算符operator int(),它将MyInt类型转换为int类型。当我们将一个MyInt对象赋值给int类型的变量时,编译器会自动调用这个类型转换运算符,将MyInt转换为int。

需要注意的是,类型转换运算符通常被定义为成员函数,并且没有参数(除了可能的const和引用修饰符)。它们没有返回类型,但返回的值类型就是要转换的目标类型。

需要谨慎使用类型转换运算符,因为它们可能导致意外的隐式类型转换,可能会降低代码的可读性和可维护性。

ifstream

ifstream是C++标准库中的一个输入文件流类,用于从文件中读取数据。它是istream类的派生类,继承了istream类中的输入操作。

使用ifstream类,你可以打开一个文件,从文件中读取数据,并进行相应的操作。以下是一个简单的示例,演示了如何使用ifstream读取文件内容:

#include <iostream>
#include <fstream>

int main() {
  std::ifstream file("example.txt"); // 打开文件

  if (file.is_open()) { // 检查文件是否成功打开
    std::string line;
    while (std::getline(file, line)) { // 逐行读取文件内容
      std::cout << line << std::endl; // 输出每一行内容
    }
    file.close(); // 关闭文件
  } else {
    std::cout << "无法打开文件" << std::endl;
  }

  return 0;
}

在上面的示例中,我们首先创建了一个ifstream对象file,并使用文件名"example.txt"来打开文件。然后,我们使用is_open()函数检查文件是否成功打开。如果文件成功打开,我们使用getline()函数逐行读取文件内容,并输出每一行的内容。最后,我们使用close()函数关闭文件。

需要注意的是,ifstream类的对象在使用完毕后,应该调用close()函数关闭文件。另外,ifstream类还提供了其他的成员函数,用于读取不同类型的数据,如read()get()getline()等。

在这里插入图片描述

在这里插入图片描述
提取日期类前提:日期类重载了流提取

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

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

相关文章

Spring Boot数据访问基础知识与JDBC简单实现

目录 Spring Boot数据访问基础知识 Spring Data ORM JDBC JPA JDBC简单实现 步骤1&#xff1a;新建Maven项目&#xff0c;添加依赖 步骤2&#xff1a;配置数据源—让程序可以访问到 步骤3&#xff1a;配置数据源—让IDEA可以访问到 步骤4&#xff1a;添加数据库和表 …

今天面了一个来字节要求月薪24K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

4.DNS和负载均衡

文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发&#xff0c;前端Layui&#xff0c;数据库mysql&#xff0c;是一款实用的企业办公系统。可多角色登录&#xff0c;集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…

构建器/建造者/构建者模式(C++)

定义 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。 应用场景 在软件系统中&#xff0c;有时候面临着“一个复杂对象”的创建工作&#xff0c;其通常由各个部分的子对象用一定的算法构成;由于需求的变化&#xff0c;这个复杂对象…

Homer:一个简单的静态主页

什么是 Homer ? Homer 是一个完全静态的 html/js 仪表板&#xff0c;基于一个简单的 yaml 配置文件。它旨在由 HTTP 服务器提供服务&#xff0c;如果您直接通过 file:// 协议打开 index.html&#xff0c;它将无法工作。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 h…

RISC-V基础之函数调用(四)非叶函数调用(包含实例)

叶函数是指不调用其他函数&#xff0c;也不改变任何非易失性寄存器的函数2。叶函数通常是一些简单的操作&#xff0c;如数学运算或逻辑判断。叶函数的特点是可以通过模拟返回来展开&#xff0c;即不需要保存或恢复寄存器的状态。 非叶函数是指调用其他函数或改变非易失性寄存器…

百度智能云“千帆大模型平台”升级:大模型最多,Prompt模板最全

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Rust 原生支持龙架构指令集

导读近日&#xff0c;Rust 开源社区发布 1.71.0 版本&#xff0c;实现对龙架构&#xff08;LoongArch&#xff09;指令集的原生支持。 龙架构操作系统发行版和开发者可基于上游社区源代码构建或直接下载 Rust 开源社区发布的龙架构二进制版本。Rust 开发者将在龙架构平台上获得…

【Vue】Parsing error: No Babel config file detected for ... vue

报错 Parsing error: No Babel config file detected for E:\Study\Vue网站\实现防篡改的水印\demo02\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files.             …

23年电赛D题-信号调制方式识别与参数估计装置

红叶何时落水 题目 题目分析 该题目的是制作一个信号检测以及解调装置 主要的任务有三个 1.六种信号的识别 2.信号相关参数的测量 3.信号解调 任务一 识别信号有很多思路&#xff0c;最简单的方式便是通过对信号进行FFT分析&#xff0c;分析其中的各个谐波的特征值。 …

自动化测试CSS元素定位

目录 1.1 CSS定位 1.1.1 绝对路径定位 1.1.2 相对路径定位 1.1.3 类名定位 1.1.4 属性定位 1.1.4.1 ID属性定位 1.1.4.2 其他属性定位 1.1.4.3 模糊属性定位 1.1.5 子页面元素查找 1.1.6 伪类定位 1.1 CSS伪类 1.1 CSS定位 1.1.1 绝对路径定位 目标 查找第一个文…

CS 144 Lab Seven -- putting it all together

CS 144 Lab Seven -- putting it all together 引言测试lab7.ccUDPSocketNetworkInterfaceAdapterTCPSocketLab7main方法子线程 小结 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Checkpoint 6: putting it all together 引言 本实验无需进行任何编…

HubSpot网页设计神器,你想要的Landing Page都在这里!

在当今数字化时代&#xff0c;Landing Page&#xff08;落地页&#xff09;已成为营销策略中不可或缺的一环。它是与潜在客户首次接触的窗口&#xff0c;能够直接影响转化率和销售结果。而作为一款领先的营销自动化工具&#xff0c;HubSpot为企业提供了打造引人注目的Landing P…

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后&#xff0c;保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

Spring Cloud 的版本和SpringBoot的版本

Spring Cloud 的版本选择 Spring Cloud 和SpringBoot的版本存在对应关系 Spring Cloud 的版本和SpringBoot的版本&#xff0c;存在对应关系。最新的SpringCloud版本&#xff08;发布文章时为2022.0.3&#xff09;&#xff0c;需要SpringBoot&#xff08;3.0.9&#xff09; 的…

爬虫获取电影数据----以沈腾参演电影为例

数据可视化&分析实战 1.1 沈腾参演电影数据获取 文章目录 数据可视化&分析实战前言1. 网页分析2. 构建数据获取函数2.1 网页数据获取函数2.2 网页照片获取函数 3. 获取参演影视作品基本数据4. 电影详细数据获取4.1 导演、演员、描述、类型、投票人数、评分信息、电影海…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…

STM32基础入门学习笔记:内部高级功能应用

文章目录&#xff1a; 一&#xff1a;低功耗模式 1.睡眠模式测试程序 NVIC.h NVIC.c key.h key.c main.c 2.停机模式测试程序 main.c 3.待机模式测试程序 main.c 二&#xff1a;看门狗 1.独立看门狗测试程序 iwdg.h iwdg.c main.c 2.窗口看门狗测试程序 wwdg…

Unity面板究极优化

首先对于大项目来说UI首选一定的UGUI&#xff0c;目前没有啥可选的余地。多一点都是对性能的负担&#xff0c;UGUI底层基于多线程技术&#xff0c;可以有效分担压力&#xff0c;对于一些不是那么重的面板几乎无感。 无论其他面板只是在此基础上修改的&#xff0c;但每多一层&am…