c++类型强制转换
2021/12/28 22:37:27
本文主要是介绍c++类型强制转换,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.const_cast
特性:1)可以去除变量的const 或者 volatile属性
void Type_transform::ConstCast() { const Test t; t.s = "1111111"; //const 无法直接赋值 编译报错 Test &tt = const_cast<Test&>(t); tt.s = "1111111111"; //使用const_cast转换后取出了const属性可以正常赋值 }
2.static_cast
静态类型转换,基础类型的转换,不支持完全没有关系的两个类之间进行转换。
特性:1)由子类转成父类没有问题,但由父类转成子类不安全
2)完全没有关系的两个类之间不可以进行转换。
void Type_transform::StaticCast() { Children *c = new Children; qInfo() << "c" << c->getParent() << endl; Parent *p = static_cast<Children*>(c); //子类转父类没有问题 qInfo() << "p" << p->getParent() << endl; Parent *pp = new Parent; Children *cc = static_cast<Children*>(pp); if(cc != nullptr){ qInfo() << cc->getParent() << endl; qInfo() << cc->getChildren() << endl; //父类转子类,调用子类成员函数时会出现问题 //(当然会有问题,父类根本没有子类的函数~~) } // Test *t = new Test; // pp = static_cast<Parent *>(t); //完全不相关的类型不可以转换 delete c; delete pp; }
3.dynamic_cast
动态类型转换
特性:1)与static_cast相比,添加了由父类转为子类的检测,如果父类转换为子类会出错,返回一个空指针。
2)如果由父类转换为子类,父类一定要有虚函数,目的时可以生成虚函数表,让编译器知道父子类的关系,要不编译器会报错
void Type_transform::DynamicCast() { Children *c = new Children; qInfo() << "c" << c->getParent() << endl; Parent *p = dynamic_cast<Children*>(c); //子类转父类没有问题 qInfo() << "p" << p->getParent() << endl; Parent *pp = new Parent; Children *cc = dynamic_cast<Children*>(pp); //必须要有虚函数生成虚函数表,不然编译器报错 if(cc != nullptr){ //转换出错,返回nullptr cc->getChildren(); } delete c; delete pp; }
4.reinterpret_cast
仅重新解释类型,不知道有什么用(
这篇关于c++类型强制转换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升