c语言强制类型转换详解,c语言类型转换注意点( 二 )


允许将任何指针转换为任何其他指针类型(如 char* 到 int* 或 One_class* 到 Unrelated_class* 之类的转换, 但其本身并不安全)
也允许将任何整数类型转换为任何指针类型以及反向转换 。
reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性 。
reinterpret_cast 的一个实际用途是在哈希函数中, 即, 通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引 。
bad_cast
由于强制转换为引用类型失败, dynamic_cast 运算符引发 bad_cast 异常 。
bad_cast 使用
try { Circle& ref_circle = dynamic_cast<Circle&>(ref_shape); } catch (bad_cast b) { cout << "Caught: " << b.what(); } 运行时类型信息 (RTTI)dynamic_cast
用于多态类型的转换
typeid
typeid 运算符允许在运行时确定对象的类型
type_id 返回一个 type_info 对象的引用
如果想通过基类的指针获得派生类的数据类型, 基类必须带有虚函数
只能获取对象的实际类型
type_info
type_info 类描述编译器在程序中生成的类型信息 。 此类的对象可以有效存储指向类型的名称的指针 。 type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值 。 类型的编码规则和排列顺序是未指定的, 并且可能因程序而异 。
头文件:typeinfo
typeid、type_info 使用
#include <iostream>using namespace std;class Flyable // 能飞的{public: virtual void takeoff() = 0; // 起飞 virtual void land() = 0; // 降落};class Bird : public Flyable // 鸟{public: void foraging() {...} // 觅食 virtual void takeoff() {...} virtual void land() {...} virtual ~Bird(){}};class Plane : public Flyable // 飞机{public: void carry() {...} // 运输 virtual void takeoff() {...} virtual void land() {...}};class type_info{public: const char* name() const; bool operator == (const type_info & rhs) const; bool operator != (const type_info & rhs) const; int before(const type_info & rhs) const; virtual ~type_info();private: ...};void doSomething(Flyable *obj) // 做些事情{ obj->takeoff(); cout << typeid(*obj).name() << endl; // 输出传入对象类型("class Bird" or "class Plane") if(typeid(*obj) == typeid(Bird)) // 判断对象类型 { Bird *bird = dynamic_cast<Bird *>(obj); // 对象转化 bird->foraging(); } obj->land();}int main(){Bird *b = new Bird();doSomething(b);delete b;b = nullptr;return 0;}今天的分享就到这里了, 大家要好好学C++哟~
写在最后:对于准备学习C/C++编程的小伙伴, 如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!
编程学习书籍分享:
编程学习视频分享:
整理分享(多年学习的源码、项目实战视频、项目笔记, 基础入门教程)
欢迎转行和学习编程的伙伴, 利用更多的资料学习成长比自己琢磨更快哦!


特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。