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

C++四种类型转换方式

  • const_cast,去掉(指针或引用)常量属性的一个类型转换,但需要保持转换前后类型一致
  • static_cast,提供编译器认为安全的类型转换(最常使用)
  • reinterpret_cast,类似于c语言风格的强制类型转换,不保证安全;
  • dynamic_cast,主要用于继承结构中,可以支持RTTI类型识别的(基类到派生类)转换

const_cast

	const int a = 10;//const_cast去掉常量属性,从const int *转换成int *int* p = const_cast<int *>(&a);//const_cast去掉常量属性,从const int &转换成int &int ref = const_cast<int&>(a);//报错,无法从const int 转换成int,//const_cast<这里必须是指针类型或引用类型>int b = const_cast<int> (a);//const_cast转换前后需要保持类型一致,这里错误,无法从const int *转换成char *char* p = const_cast<char*>(&a);

static_cast

	//static_cast,可以转换编译器认为有联系之间的类型,如(int和char),(基类和派生类)//int 和 char 都是整数类型,可以安全转换(但可能会发生截断,如果 b 超过 char 的范围int b = 10;char c = static_cast<char> (b);//没有任何联系的两个类型转换,编译器认为是不安全的,不能转换成功// int* 和 short* 是完全不同的指针类型,它们指向的数据大小不同(int 通常是 4 字节,short 通常是 2 字节)int *p = nullptr;short* p1 = static_cast<short> (p);

这里可以转换编译器认为有联系的类型,拒绝不安全的类型转换。

reinterpret_cast转换

	int* p = nullptr;//提供c语言风格的强制类型转换,不保证安全,等效于double *p1=(double *) p;//实际上不安全,double解引用为8个字节,int解引用为4个字节,会造成访问越界double* p1 = reinterpret_cast<double *> (p);

dynamic_cast转换

class Animal {
public:virtual void bark() = 0; // 必须要有虚函数(多态类型)
};class Dog : public Animal {
public:void bark() { cout << "Dog Woof! Woof!" << endl; }
};class Cat : public Animal {
public:void bark() { cout << "Cat Meow! Meow!" << endl; }
};void showAnimal(Animal* animal) {animal->bark();	
}int main() {Dog dog;Cat cat;showAnimal(&dog); showAnimal(&cat); return 0;
}

这里通过的showAnimal函数通过基类指针指向不同的派生类,从而实现调用其对应的重写方法。
但是比如说,对于Dog类,我想调用实现其另一个eat方法。

class Dog : public Animal {
public:void bark() { cout << "Dog Woof! Woof!" << endl; }//新增eat方法void eat() { cout << "Dog like eat bone!"<<endl; }
};

当调用showAnimal方法时,如果其指向的时Dog方法,就调用eat方法,就可以通过dynamic_cast实现,如代码所示

void showAnimal(Animal* animal) {Dog* dog = static_cast<Dog*>(animal); // 尝试转换为 Dog*if (dog) {dog->eat();}else{animal->bark();}}

dynamic_cast<Dog*>(animal) 会检查 animal 是否真的指向 Dog 对象:

  • 如果是,返回 Dog*;
  • 如果不是,返回 nullptr(而不是崩溃或未定义行为)

在这里插入图片描述

我们之前也说了static_cast也可以进行基类和派生类的转换,但是这里是不会判断直接进行转换的,不管基类指针是不是指向Dog的派生类,都一律被转换成Dog的派生类;而dynamic_cast会进行判断,只有基类指针指向的是Dog类型的派生类时,才发生转换,否则返回nullptr。

在这里插入图片描述

最后,目前就先总结这些,后续项目中遇到了再添加内容。

http://www.dtcms.com/a/225152.html

相关文章:

  • 017搜索之深度优先搜索——算法备赛
  • 宝塔专属清理区域,宝塔清理MySQL日志(高效释放空间)
  • Azure Devops 系列之三- vscode部署function app
  • LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++
  • 李臻20242817_安全文件传输系统项目报告_第14周
  • 力扣面试150题--二叉树的锯齿形层序遍历
  • 自动驾驶系统研发系列—激光雷达感知延迟:自动驾驶安全的隐形隐患?
  • AWS之数据分析
  • 【科研绘图系列】R语言绘制论文组合图形(multiple plots)
  • AWS之迁移与传输服务
  • 汽车安全 2030 预测 (功能安全FuSa、预期功能安全SOTIF、网络安全CyberSecurity):成本、效益与行业影响
  • 汽车安全:功能安全FuSa、预期功能安全SOTIF与网络安全Cybersecurity 解析
  • 机器学习-ROC曲线​​ 和 ​​AUC指标
  • 【Unity博客节选】Timeline 内部结构 IntervalTree 分析
  • 基于微信小程序的垃圾分类系统
  • 十三、【核心功能篇】测试计划管理:组织和编排测试用例
  • vue-11(命名路由和命名视图)
  • 【小米拥抱AI】小米开源视觉大模型—— MiMo-VL
  • 2,QT-Creator工具创建新项目教程
  • debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt
  • PHP与MYSQL结合中中的一些常用函数,HTTP协议定义,PHP进行文件编程,会话技术
  • Android第十二次面试-多线程和字符串算法总结
  • 健康检查:在 .NET 微服务模板中优雅配置 Health Checks
  • 基于微信小程序的云校园信息服务平台设计与实现(源码+定制+开发)云端校园服务系统开发 面向师生的校园事务小程序设计与实现 融合微信生态的智慧校园管理系统开发
  • python集成inotify-rsync实现跨服务器文件同步
  • Java对象的内存结构
  • Git仓库大文件清理指南
  • C++测开,自动化测试,业务(第一段实习)
  • 【PyQt5】PyQt5初探 - 一个简单的例程
  • 数据结构-排序-排序的七种算法(2)