返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >c++类型转换及RTTI运行阶段类型识别
  • 483
分享到

c++类型转换及RTTI运行阶段类型识别

c++类型转换RTTIc++运行阶段类型识别 2023-05-18 11:05:29 483人浏览 泡泡鱼
摘要

目录正文1、static_cast2、dynamic_cast3、const_cast4、reinterpret_cast5、RTTI正文 我们都知道c++完全兼容C语言,C语言的转

正文

我们都知道c++完全兼容C语言,C语言的转换方式很简单,可以在任意类型之间转换,但这也恰恰是缺点,因为极其不安全,可能不经意间将指向const对象的指针转换成非const对象的指针,可能将基类对象指针转成了派生类对象的指针,这种转换很容易出bug,需要严格审查代码才能消除这种隐患,但是C这种转换方式不利于我们审查代码,且程序运行时也可能会出bug。

所以C++引入的这几种类型转换可以完美的解决上述问题,不同场景下不同需求使用不同的类型转换方式,同时有利于代码审查。

孙悟空都只有七十二变,不能瞎变,所以c++给类型转换做了限制。

1、static_cast

static_cast

仅当type_name可以被隐式转换为expression所属类型或expression可隐式转换成type_name所属类型时,上述转换才是合法的。

static_cast是用得最多的一类类型转换符,常见的枚举值转成整形,float转整形之类的,都是可以的。

另外,static_cast还可以将派生类指针转换为基类指针,而且一定条件下还能将基类指针转换为派生类指针,且不会报错,只是一些只有派生类才会有的函数、成员变量,转换过来的指针也不会有

Test test;
    TestDerived derived;
    cout << "----------" << endl;
    Test* tp = static_cast<Test*>(&derived);
    tp->func();
    cout << "-----------------" << endl;
    TestDerived* dp = static_cast<TestDerived*>(&test);
    dp->func();
    dp->speak();
//以下是控制台输出
----------
TestDerived func
-----------------
test func

2、dynamic_cast

dynamic_cast运算符的语法和static_cast一样,但它的作用和static_cast略有区别。

Kotlin中有个语法叫 is,本人觉得dynamic_cast就是kotlin中的is

dynamic_cast,一般只用于基类和派生类之间的转换,而且只能用于派生类指针转换成基类指针,不能反向转换

    if (Test* tpp = dynamic_cast<Test*>(&derived)) {
        cout << "devived can cast to test" << endl;
    }
    if (TestDerived* dpp = dynamic_cast<TestDerived*>(&test)) {
        cout << "test can cast to TestDerived" << endl;
    }
//输出
devived can cast to test

如代码所示,如果dynamic_cast转换成功,将返回一个指针,如果转换失败,将返回一个空指针。所以代码中的两个if判断,只有一个生效。看这种调用方式,是不是和kotlin中的 is 很相象呢

3、const_cast

const_cast运算符,只用于执行一种用途的类型转换,即改变值为const或volatile。

它一般用于去const运算符。但去运算符之后的效果却是难以预料。

    const int num = 10;
    const int* tempN = const_cast<const int*>(&num);
    cout << "tempn = " << *tempN << endl;
    int* temppp = const_cast<int*>(tempN);
    *temppp = 20;
    cout << "num = " << num << "  tempn = " << *tempN << "  temppp = " << *temppp << endl;
输出:
tempn = 10
num = 10  tempn = 20  temppp = 20

如上述代码所示,num是const类型的整形值,它的值始终为10,无法更改。这种转换慎用

4、reinterpret_cast

没有啥特殊场景运用,类似于c语言中的强制转换,一般用得极少。

5、RTTI

RTTI,运行阶段类型识别的简称。

在多态中,比如上面代码中有基类Test和TestDerived,现在有一个Test指针,但不知道这个指针究竟指向的是基类还是派生类,怎么知道指针是指向的哪种对象呢?

这就是RTTI的工作,在运行时判断类型。目前c++中有3个支持RTTI的元素:

  • dynamic_cast,将一个指向基类的指针来生成一个指向派生类的指针,否则,该运算符将返回空指针
  • typeid,返回一个指针对象类型的值
  • type_info,结构存储了有关特定类型的信息

RTTI场景下,父类必须要有虚函数信息,因为RTTI信息存储在虚函数表中。

以上就是c++类型转换及RTTI运行阶段类型识别的详细内容,更多关于c++类型转换RTTI的资料请关注编程网其它相关文章!

--结束END--

本文标题: c++类型转换及RTTI运行阶段类型识别

本文链接: https://lsjlt.com/news/212022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • c++类型转换及RTTI运行阶段类型识别
    目录正文1、static_cast2、dynamic_cast3、const_cast4、reinterpret_cast5、RTTI正文 我们都知道C++完全兼容C语言,C语言的转...
    99+
    2023-05-18
    c++类型转换RTTI c++ 运行阶段类型识别
  • C++运行时类型识别与转换实现方法
    目录1.运行时类型转换2.typeid操作符2.1类型转换到中间层次类型2.2void型指针2.3运用带模板的RTTI3.多重继承4.合理使用RTTI5.RTTI的机制和开销6.小结...
    99+
    2024-04-02
  • 怎么在C++中定义RTTI的类型进行转换
    这篇文章给大家介绍怎么在C++中定义RTTI的类型进行转换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言RTTI 是 Run Time Type Information 的缩写,从字面上来理解就是执行时期的类型信息...
    99+
    2023-06-07
  • go类型转换及与C的类型转换方式
    GO类型转换及与C的类型转换 类型转换 语法 dst := float32(src) 示例 var num int = 520 f32 := float32(num) i6...
    99+
    2022-06-07
    GO
  • golang 字段类型转换
    Golang 字段类型转换在 Golang 中,变量的类型是比较严格的,这也是 Golang 语言设计出色的原因之一。但在实际的编程场景中,我们会遇到不同类型的值之间需要转换的情况。因此,了解 Golang 中的类型转换是很重要的。在 Go...
    99+
    2023-05-14
  • C++类型转换运算符详解
    目录老式显式类型转换c++的显示类型转换为什么要有新的类型转换具体应该使用哪种转换static_cast运算符dynamic_cast运算符const_cast运算符reinterp...
    99+
    2024-04-02
  • 如何使用运行时类型反射来转换类型?
    问题内容 我正在尝试使用泛型构建一个函数,它将接口切片转换为 t 类型的切片。 我想出了以下内容: func convertInterfaceArray[T any](input []...
    99+
    2024-02-06
  • C++算术运算符与类型转换
    目录1、算术运算符2、优先级3、类型转换初始化和赋值时的转换使用花括号进行转换4、表达式中转换5、强制类型转换1、算术运算符 C++当中提供5种基础的算术运算符:加法、减法、乘法、除...
    99+
    2024-04-02
  • 【Kotlin】类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )
    文章目录 一、使用 is 运算符进行类型检测二、使用 as 运算符进行类型转换 ( 智能类型转换 )三、Any 超类 一、使用 is 运算符进行类型检测 在 Kotlin 中 , 如果不确定一个 实例对象的类型 , ...
    99+
    2023-08-23
    kotlin java is运算符 as运算符 Any超类
  • C# 数据类型转换
    目录前言相关介绍一、函数方法二、类型转换[1]. 使用Convert转换[2]. 使用类型名进行转换总结前言 在使用Console.Read()或Console.ReadLine(...
    99+
    2024-04-02
  • C++类型转换详解
    目录内置类型的转换自定义类型转换explicit 关键字提醒提问:编译器在什么时候使用Stone(double)?转换函数概念介绍自动引用类型转换缺陷总结C++对于内置类型有...
    99+
    2024-04-02
  • C++中图片类型的识别与转换详解方法
    目录1、图片类型的识别1.1、bmp图片1.2、jpg图片1.3、jpg图片1.4、gif图片1.5、tiff图片1.6、使用CreateFile和ReadFile API函数读取内...
    99+
    2024-04-02
  • c++怎么将string类型转换成int类型
    要将string类型转换为int类型,你可以使用C++的内置函数stoi()或者stringstream类来实现。 使用stoi(...
    99+
    2023-10-27
    c++
  • c语言怎么进行类型转换
    c 语言提供了两种类型转换:隐式转换(自动)和显式转换(手动)。显式转换方法包括强制类型转换运算符 (type)、sprintf()/sscanf() 函数、atoi()/atof() ...
    99+
    2024-04-13
    c语言 数据丢失 隐式转换
  • Python3数据类型及转换
    I. 数据类型 Python3将程序中的任何内容统称为对象(Object),基本的数据类型有数字和字符串等,也可以使用自定义的类(Classes)创建新的类型。 Python3中有六个标准的数据类型: Number(数字) String...
    99+
    2023-01-30
    数据类型
  • C++的四种类型转换
    目录一、隐式类型转换和显示类型转换二、C++的四种类型转换2.1 static_cast 相似转化2.2 reinterpret_cast 不同类型转化2.3 const_cast ...
    99+
    2023-05-14
    C++实现类型转换方法 C++实现类型转换
  • C++ 的类型转换详解
    目录一、C++ 类型转换1.静态类型转换1.语法格式2.转化规则 2.重解释类型转换1.语法格式2.转化规则 3.常类型转换1.语法格式2.语法规则 3.const 常变量(补充) ...
    99+
    2024-04-02
  • C#数据类型转换(显式转型、隐式转型、强制转型)
    C# 的类型转换有显式转型 和 隐式转型 两种方式。 显式转型:有可能引发异常、精确度丢失及其他问题的转换方式。需要使用手段进行转换操作。隐式转型:不会改变原有数据精确度、引发异常,...
    99+
    2024-04-02
  • golang 如何使用类型断言进行类型转换
    go 中类型断言用于将接口值转换为更具体的类型。它包含以下步骤:声明接口值和目标类型。使用类型断言语法将接口值转换为目标类型,并将结果赋值给变量。使用布尔变量检查转换是否成功。如果转换失...
    99+
    2024-05-01
    类型转换 类型断言 golang
  • C#类型转换实例分析
    这篇“C#类型转换实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#类型转换实例分析”文章吧。C# 类型转...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作