C++:typeid4种cast转换

typeid

  • typeid
    typeid是C++标准库中提供的一种运算符,它用于获取类型的信息。它主要用于类型检查和动态类型识别。当你对一个变量或对象使用typeid运算符时,它会返回一个指向std::type_info类型的指针,这个信息包含了关于该类型名称、大小、基本成员等元数据。
    (1)typeid是一个运算符,类似于sizeof
    (2)typeid定义在头文件typeinfo中,必须包含该头文件
    (3)typeid用来返回一个变量(表达式)(对象)的类型
    (4)typeid使用实战
#include <typeinfo>int main() {int a; // a type:icout << "a type:" << typeid(a).name() << endl;char a1; // a1 type:ccout << "a1 type:" << typeid(a1).name() << endl;uint8_t a2; // a2 type:hcout << "a2 type:" << typeid(a2).name() << endl;unsigned char a3; // a3 type:hcout << "a3 type:" << typeid(a3).name() << endl;signed char a4; // a4 type:acout << "a4 type:" << typeid(a4).name() << endl;return 0;
}

在这里插入图片描述

  • typeid的深层次说明
    (1)一个表达式的类型分静态类型和动态类型,分别对应编译期和运行时类型决策系统
    (2)typeid可用来返回静态类型,也可用来返回动态类型
    (3)typeid是C++语言本身的特性,由编译器和库函数共同支撑
    (4)typeid真正大用在引入class和继承后,并结合指针和引用后才能显现出来

4种cast转换

  • static_cast
    static_cast 用于在类型之间进行标准转换,如基本类型转换、类层次结构之间的向上和向下转换,以及隐式转换。
    (1)源生类型之间的隐式类型转换,可以用static_cast来明确告知编译器,避免警告,转换后可能丢失精度,正确性需要程序员自己保证
    (2)用来将void *p转为具体的指针类型,取回原有的指针类型
    (3)用于类层次结构中父类和子类之间指针和引用的转换。其中上行转换时安全的,而下行转换时不安全的。
    (4)总结:static_cast<>()是编译时静态类型检查,使用static_cast可以尽量发挥编译器的静态类型检查功能,但是并不能保证代码一定“正确”(譬如可能会丢失精度导致错误,可能经过void *之后导致指针类型错误,可能下行转换导致访问错误。)
    (5)评价:static_cast必须会用,见了必须认识,能理解使用static_cast的意义,但是实际上只能解决很初级的编程问题,属于初级语法特性。
class Base {
public:virtual void show() { std::cout << "Base class" << std::endl; }
};class Derived : public Base {
public:void show() override { std::cout << "Derived class" << std::endl; }
};int test() {// 基本类型转换int a = 10;double b = static_cast<double>(a);std::cout << "a: " << a << ", b: " << b << std::endl;int *p = &a;void *p1 = p; p1已经丢掉了自己的类型int *p2 = static_cast<int *>(p1); // p2又取回了自己的类型// std::cout << "*p1: " << *p1 << std::endl;//error: ‘void*’ is not a// pointer-to-object typeint *p3 = (int *)p1;std::cout << "*p3: " << *p3 << std::endl;std::cout << "*p2: " << *p2 << std::endl;// 类层次结构转换 类层次结构之间的向上和向下转换Base *basePtr = new Derived();Derived *derivedPtr = static_cast<Derived *>(basePtr);derivedPtr->show(); // 输出 "Derived class"delete basePtr;return 0;
}

在这里插入图片描述

  • reintepret_cast
    reinterpret_cast 用于将指针或引用类型转换为其他指针或引用类型。它通常用于底层的、与类型无关的编程,需要谨慎使用。
    (1)用于明确告知编译器该类型转换在编译时放行,正确性由程序员自己负责
    (2)reintepret_cast转换前后对象的二进制未发生任何变化,只是对这些二进制位的编译器类型标识发生了变化,或者说是编译器看待这些二进制位的结论不同了
    (3)reintepret_cast一般用于将指针转成int或者回转,将A类型指针转为B类型指针等
    (4)reintepret_cast其实就是让C++在本次转换中放弃严苛的编译器类型检查

  • const_cast
    const_cast 用于在类型中添加或移除 const 属性。它常用于需要修改常量数据的场景。
    (1)用来修改类型的const或volatile属性
    (2)格式为:const_cast<type_id> (expression)
    (3)思考:const_cast为什么能修改const为非const?

#include <iostream>void modifyValue(const int* ptr) {int* modifiablePtr = const_cast<int*>(ptr);*modifiablePtr = 20;
}int main() {const int value = 10;std::cout << "Before modification: " << value << std::endl;modifyValue(&value);std::cout << "After modification: " << value << std::endl;  // 输出结果是未定义的行为return 0;
}
  • dynamic_cast
    dynamic_cast 用于在类层次结构中进行安全的向下转换,前提是类必须有虚函数。它在运行时进行类型检查,失败时返回 nullptr。
    (1)只用在父子class的指针和引用访问时的转换中,尤其是下行转换时
    (2)属于一种运行时转换机制,运行时才能知道转换结果是NULL还是有效对象
    (3)运行时确定对象类型RTTI(run time type indentification)是一种需求,C++有一套机制来实现
#include <iostream>class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() override {std::cout << "Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived();Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if (derivedPtr) {derivedPtr->show();  // 输出 "Derived class"} else {std::cout << "dynamic_cast failed" << std::endl;}delete basePtr;return 0;
}
  • 4种cast转换总结
    (1)C中一般都用隐式转换或强制类型转换解决,本质上是一种一刀切方案,全靠程序员自己把控
    (2)C++中4种cast转换实际上是细分了具体场景,让程序员在具体情况下显式的使用相应的cast来转换,让编译器和运行时尽可能帮程序员把关。

总结

了解typeid的使用方法
认识4种cast转换,会简单使用

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

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

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

相关文章

Pikachu靶场--Sql Inject

参考借鉴 pikachu靶场练习&#xff08;详细&#xff0c;完整&#xff0c;适合新手阅读&#xff09;-CSDN博客 数字型注入(post) 这种类型的SQL注入利用在用户输入处插入数值&#xff0c;而不是字符串。攻击者试图通过输入数字来修改SQL查询的逻辑&#xff0c;以执行恶意操作。…

Unity Shader 极坐标

Unity Shader 极坐标 前言项目简单极坐标极坐标变体之方形极坐标变体之圆形拉花 鸣谢 前言 极坐标记录 项目 简单极坐标 极坐标变体之方形 极坐标变体之圆形 拉花 鸣谢 【菲兹杂货铺】【Unity Shader教程】极坐标实现以及极坐标的两种变体

【87 backtrader期权策略】基于50ETF期权的covered-call-strategy

前段时间有读者希望能够实现一个期权策略的模板,这段时间通过akshare下载了期权的数据,并进行了清洗,写了一个最简单的期权策略,供大家参考。 策略逻辑: 这是151 trading strategies中的一个期权策略。 买入50ETF基金,手续费按照万分之二计算,一直持有卖出一个最远期的…

【实施】系统实施方案(软件方案Word)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施 软件开发全套资料获取&#xff1a;私信或者进主页获取。 软件产品&#xff0c;特别是行业解决方案软件产品不同于一般的商品&#xff0c;用户购买软…

13_旷视轻量化网络--ShuffleNet V2

回顾一下ShuffleNetV1:08_旷视轻量化网络--ShuffleNet V1-CSDN博客 1.1 简介 ShuffleNet V2是在2018年由旷视科技的研究团队提出的一种深度学习模型&#xff0c;主要用于图像分类和目标检测等计算机视觉任务。它是ShuffleNet V1的后续版本&#xff0c;重点在于提供更高效的模…

antd Select前端加模糊搜索

背景&#xff1a;前端的小伙伴经常在开发antd Select的时候后端不提供搜索模糊搜索接口&#xff0c;而是全量返回数据&#xff0c;这个时候就需要我们前端自己来写一个模糊搜索了。 效果 代码截图 代码 <SelectshowSearchmode"multiple"options{studioList}filte…

运维锅总详解Prometheus

本文尝试从Prometheus简介、架构、各重要组件详解、relable_configs最佳实践、性能能优化及常见高可用解决方案等方面对Prometheus进行详细阐述。希望对您有所帮助&#xff01; 一、Prometheus简介 Prometheus 是一个开源的系统监控和报警工具&#xff0c;最初由 SoundCloud …

基于模糊神经网络的时间序列预测(以hopkinsirandeath数据集为例,MATLAB)

模糊神经网络从提出发展到今天,主要有三种形式&#xff1a;算术神经网络、逻辑模糊神经网络和混合模糊神经网络。算术神经网络是最基本的&#xff0c;它主要是对输入量进行模糊化&#xff0c;且网络结构中的权重也是模糊权重&#xff1b;逻辑模糊神经网络的主要特点是模糊权值可…

Python技术笔记汇总(含语法、工具库、数科、爬虫等)

对Python学习方法及入门、语法、数据处理、数据可视化、空间地理信息、爬虫、自动化办公和数据科学的相关内容可以归纳如下&#xff1a; 一、Python学习方法 分解自己的学习目标&#xff1a;可以将学习目标分基础知识&#xff0c;进阶知识&#xff0c;高级应用&#xff0c;实…

2024 vue3入门教程:windows系统下部署node环境

一、打开下载的node官网 Node.js — 下载 Node.js 二、根据个人喜好的下载方法&#xff0c;下载到自己的电脑盘符下 三、我用的是方法3下载的压缩包&#xff0c;解压到E盘nodejs目录下&#xff08;看个人&#xff09; 四、配置电脑的环境变量&#xff0c;新建环境变量的时候…

【ESP32】打造全网最强esp-idf基础教程——14.VFS与SPIFFS文件系统

VFS与SPIFFS文件系统 这几天忙着搬砖&#xff0c;差点没时间更新博客了&#xff0c;所谓一日未脱贫&#xff0c;打工不能停&#xff0c;搬砖不狠&#xff0c;明天地位不稳呀。 不多说了&#xff0c;且看以下内容吧~ 一、VFS虚拟文件系统 先来看下文件系统的定义&#x…

vue中【事件修饰符号】详解

在Vue中&#xff0c;事件修饰符是一种特殊的后缀&#xff0c;用于修改事件触发时的默认行为。以下是Vue中常见的事件修饰符的详细解释&#xff1a; .stop 调用event.stopPropagation()&#xff0c;阻止事件冒泡。当你在嵌套元素中都有相同的事件监听器&#xff08;如click事件…

AI模型的奥运会:谁将在OlympicArena中夺冠?

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 引言&#xff1a;AI模型的奥林匹克级评测 评估和比较不同AI模型的性能始终是一个核心话题。随着技术的不断进步&#xff0c;这些模型在处理复杂任务的能力上有了显著的提升。为了更精确地衡…

Vue3学习笔记<->创建第一个vue项目(2)

新建一个项目目录 找一个盘新建一个目录&#xff0c;我这里在D盘创建一个vuedemo目录作为项目存放的目录。使用idea打开目录。   单击ieda底部的按钮“Terminal”&#xff0c;打开命令行窗口&#xff0c;如果命令行窗口当前目录不是“vuedemo”&#xff0c;就切换到“vuedem…

qt文件如何打包成一个独立的exe文件

QT官方给我们安装好了打包软件&#xff0c;就在你QT安装的位置 把这个在cmd打开C:\Qt\6.7.1\mingw_64\bin\windeployqt6.exe&#xff08;或复制地址&#xff09; 然后把要打包项目的exe复制到新的空文件夹&#xff0c;再复制他的地址 按回车后生成新文件 再下载打包软件&#…

东方航空逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; …

【AIGC】AnimateAnyone:AI赋予静态照片生命力的魔法

摘要&#xff1a; 在人工智能技术的不断进步中&#xff0c;AnimateAnyone项目以其创新性和易用性脱颖而出&#xff0c;成为GitHub上备受瞩目的AI项目之一。由阿里巴巴智能计算研究院开发的这一技术&#xff0c;允许用户通过提供一张静态照片&#xff0c;快速生成动态角色。本文…

Linux实用命令练习

目录 一、常用命令 二、系统命令 三、用户和组 四、权限 五、文件相关命令 六、查找 七、正则表达式 八、输入输出重定向 九、进程控制 十、其他命令 1、远程文件复制&#xff1a;scp 2、locate查找 3、which命令 4、设置或显示环境变量&#xff1a;export 5、修…

YOLO-V1

一、YOLO-V1整体思想与网络架构 1.1 YOLO算法整体思路解读 YOLO-V1: 经典的one-stage方法 把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01; 可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; 1、预测一张图像中有哪些物…