当前位置: 首页 > news >正文

C++复习补充 类型转换和RTTI

类型转换和RTTI

  • 类型转换
  • 类与类之间的类型转换
  • 四种显示类型转换
  • 类型转换注意事项
  • RTTI

类型转换

在 C++ 中,operator int() 是用户定义的类型转换运算符(User-Defined Conversion Operator),允许自定义对象隐式或显式转换为特定类型。除了 operator int(),你还可以定义其他类型的转换运算符,包括常见的内置类型整形和浮点数,或者指针,或者其他自定义对象

类与类之间的类型转换

//#include"List.h"
//int main()
//{
//	bit::list<int> lt = { 1,2,3,4 };
//	// 权限缩小?权限缩小和放大,仅限于const的指针和引用
//	// 这里不是权限缩小,这里是自定义类型=自定义类型之间的类型转换,重载构造函数或者类型转换
//	// 因为const_iterator是两个不同的类,重载构造函数实现
//	// 具体实现看下面ListIterator中对应的构造函数的实现
//	bit::list<int>::const_iterator cit = lt.begin();
//
//	while (cit != lt.end())
//	{
//		cout << *cit << " ";
//		++cit;
//	}
//	cout << endl;
//	return 0;
//}

类转换其他类有两种方式
重载类型转换
operator otherclass()
{};

想转换的构造函数支持该参数类型
otherclass(myclass )
{}

// iterator
//struct ListIterator<T, T&, T*>
//{
//	typedef ListNode<T> Node;
//	typedef ListIterator<T, Ref, Ptr> Self;
//	Node* _node;
//	ListIterator(Node* node)
//		:_node(node)
//	{}
//
//	ListIterator(const ListIterator<T, T&, T*>& it)
//		:_node(it._node)
//	{}
//};
//
 const_iterator
//struct ListIterator<T, const T&, const T*>
//{
//	typedef ListNode<T> Node;
//	typedef ListIterator<T, Ref, Ptr> Self;
//	Node* _node;
//	ListIterator(Node* node)
//		:_node(node)
//	{}
//
//	ListIterator(const ListIterator<T, T&, T*>& it)
//		:_node(it._node)
//	{}
//};

四种显示类型转换

  1. static_cast

​用途​:编译时已知类型关系的安全转换。
​典型场景​:

基础类型之间的显式转换(如 int→double)。
父子类指针/引用的上行转换​(子类→父类)。
​无继承关系的自定义类型转换​(需定义转换构造函数或 operator)。

  1. dynamic_cast

​用途​:运行时多态类型的安全下行转换​(父类→子类)。
​条件​:

操作数必须为多态类型​(类有虚函数)。
必须启用 RTTI(运行时类型信息)。

  1. const_cast

​用途​:修改 const 或 volatile 属性。
​典型场景​:

调用遗留 API 时去除 const(如 char* 参数需要修改)。
强制修改本应为非 const 的变量(需确保逻辑安全)。

  1. reinterpret_cast

​用途​:低级别指针类型转换或指针与整数间的转换。
​典型场景​:

指针与整数之间的互转(如内存地址操作)。
不相关指针类型之间的强制转换(如 int→char)。

类型转换注意事项

C++不是类型安全的语言,一方面用户写的自定义转换符默认支持隐式类型转换如果说考虑不全面可能会在不想要类型转换的时候隐式类型转换了(最好用explicit修饰),其次四种显示类型转换会绕过编译器检查

RTTI

RTTI是通过多态和typid来保证的,只有在多态基类必须具有虚函数表且对象必须是指向基类的指针和引用才能保证。

dynamic_cast<>支持基类向子类的显示类型转换,只有基类本身是指向子类对象的指针和引用才成立,否则会抛异常

相关文章:

  • Vue 中局部指令(directives)的用法详解
  • 深入了解指针(6)
  • 微信小程序中基于 SSE 实现轻量级实时通讯 —— 原理、实践与对比分析
  • MySQL5.7.21查询入门
  • Java生成微信小程序码及小程序短链接
  • 文档在线协同工具ONLYOFFICE教程:如何使用宏突出显示具有特定提示文本的空文本字段
  • 基于YOLO的瓷砖缺陷检测系统设计与实现(附数据集+源码)
  • EMB量产首航!炯熠电子引领「线控底盘革命」
  • vue3使其另一台服务器上的x.html,实现x.html调用中的函数,并向其传递数据。
  • react中有哪几种数据结构?分别是干什么的?
  • 水表盘数字显示区域分割数据集labelme格式538张2类别
  • 【知识科普】今天聊聊CDN
  • 【AI Weekly】AI前沿热点周刊(4.21~4.27)
  • GD32F407单片机开发入门(十六)单片机IAP(在应用编程)详解及实战源码
  • 2025汽车制造企业数字化转型路径参考
  • Android Kotlin ViewModel 错误处理:最佳 Toast 提示方案详解
  • 海外App开发进阶:AI驱动的本地化与跨平台高效架构实战
  • 重测序关系矩阵构建方式汇总
  • 【机器学习】朴素贝叶斯
  • PyCharm与Unreal Engine集成进行开发
  • 助力企业高质量出海,上海静安发放服务包、服务券
  • 太好玩了!坐进大卫·霍克尼的敞篷车进入他画笔下的四季
  • 外交部:对伊朗拉贾伊港口爆炸事件遇难者表示深切哀悼
  • A股三大股指收跌:地产股领跌,银行股再度走强
  • 大学2025丨专访南开人工智能学院院长赵新:人工智能未来会变成通识类课程
  • 校长套取学生伙食费设小金库,重庆通报6起违反八项规定典型问题