网站首页 > 精选文章 正文
在 C 语言中,进行类型转换只需要在变量前面加上变量类型,并且转换可以是双向的。例如 int 类型可以转换为 double 类型,double 类型也可以转换为 int 类型。但是这种简单粗暴的方式在 C++ 中是不合适的。第一,无法完成 C++ 中的自定义数据类型类;第二,C 语言可以在任意类型之间转换,比如可以将一个指向 const 型对象的指针转换为指向一个非 const 型对象的指针,这对类型检查非常严格的 C++ 来说,显然是不合理的,所以 C++ 提供了4种特有类型转换操作符。
1、static_cast
类似于 C 语言中的类型转换,可以进行无条件类型转换。应用场景:
- 基本类型转换。
int i = 1;
double j = static_cast <double> (i);
- 父类和子类指针之间的转换。如果父类指针指向一个对象,此时将父类指针转换为子类指针是不安全的,子类指针转换为父类指针是安全的。
class Base( ) { };
class Derived : public Base { };
Base * p1 = new Base;
Derived * p2 = new Derived;
Derived * p3 = static_cast <Derived *> (p1); // 不安全
Base * p4 = static_cast <Base *> (p2); // 安全
- 将任何类型的表达式转换为 void 类型。
注:static_cast 不能去除类型的 const 或者 volatile 属性;不能进行无关类型转换(如非基类和子类)。
2、dynamic_cast
dynamic_cast 只能用于对象指针之间的转换,转换结果亦可以是应用。在类层次间进行上行转换时,dynamic_cast 和 static_cast 的效果是一样的;在进行下行转换时,dynamic_cast 具有类型检查的功能,比 static_cast 更安全。
class Base { virtual void dummy ( ) { } };
class Derived : public Base { };
Base * b1 = new Base;
Base * b2 = new Derived;
Derived * b3 = dynamic_cast <Derived * > (b1); // 转换失败,返回 NULL
Derived * b4 = dynamic_cast <Derived * > (b2); // 转换成功
Derived & b5 = dynamic_cast <Derived & > (b1); // 转换失败(抛出异常)
Derived & b6 = dynamic_cast <Derived & > (b2); // 转换成功
注:父子类指针之间转换时,该父类中必须包含一个虚函数。
3、const_cast
用于取出 const 属性,去掉类型的 const 或者 volatile 属性,将 const 类型的指针变为非 const 类型的指针。
const int * fun(int x, int y) { };
int * ptr = const_cast < int * > (fun(2, 3));
4、reinterpret_cast
reinterpret_cast 只是重新解释类型,没有二进制的转换。应用:
- 转换的类型必须是一个指针、引用、算术类型、函数指针或者成员指针。比特位级别上进行转换。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。但不能将非32bit的实例转成指针。
- 一般用在函数指针类型之间进行转换。
- 不能保证可移植性。
注:此类型转换不安全,需谨慎使用。
猜你喜欢
- 2024-12-19 4000字教你如何创建一个基于Redis构建微服务的反应式架构
- 2024-12-19 Unite3.0主题完美移植知更鸟点赞分享样式教程
- 2024-12-19 解锁新技能
- 2024-12-19 如何在不使用流程引擎的情况下设计一套数据库表来完成审批流程?
- 2024-12-19 白羊座
- 2024-12-19 JPA自定义ID生成器,雪花算法实现代码分享
- 2024-12-19 信息茧房
- 2024-12-19 如何分享收藏日常
- 2024-12-19 智慧应急通信:跨越障碍,连接应急救援的每一环
- 2024-12-19 可爱的你俩
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)