[复习笔记] static_cast、dynamic_cast、const_cast、reinterpret_cast C++四种类型转换操作符的不同与选择

一、背景

C风格的转换虽然简单但也有不少缺点,它并不能满足C++的使用要求。
所以C++提供了四种转换操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。

二、四种转换

1. static_cast

关键字static_cast 用来在两个不同类型之间进行强制转换,并且没有运行时间检查.

用隐式和用户定义转换的组合在类型间转换。
语法
static_cast < 新类型 > ( 表达式 )   
返回 新类型 类型的值。
  • 基本类型转换。
  • 指针1:子转父-安全,父转子-不安全,没有动态类型检查。
  • 指针2:空指针 转 目标指针 。
  • 任何表达式转void类型

2. dynamic_cast

在这里插入图片描述
增加了运行时安全检查。

dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,

也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。

至于“先上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的,
普通的转换已经可以达到目的,毕竟使用dynamic_cast是需要开销的。

网络上,大家对dynamic_cast看法很多,有人认为dynamic_cast应该是最常用的类型转换方法,有人认为应该尽量避免dynamic_cast方法,具体问题具体分析。

3.const_cast

去掉const 或者 volatile 属性。
在这里插入图片描述
需要注意的是, 函数指针和成员函数指针不可用于 const_cast

const_cast 使得能够组成实际指代 const 对象 的到非 const 类型的引用或指针,或组成实际指代 volatile 对象的到非 volatile 类型的引用或指针。通过非 const 访问路径修改 const 对象和通过非 volatile 泛左值涉指 volatile 对象是未定义行为。

4.reinterpret_cast

在这里插入图片描述

与 static_cast 不同,但与 const_cast 类似,reinterpret_cast 表达式不会编译成任何 CPU 指令(除非在整数和指针间转换,或在指针表示依赖其类型的不明架构上)。它纯粹是一个编译时指令,指示编译器将 表达式 视为如同具有 新类型 类型一样处理。

简单来说,就是我本来是中国人,用返回的我=reinterpret_cast<美国人>(我)'之后,返回的我跟我一模一样,但是返回的我变成了美国人。

综上笔记,欢迎补充,祝大家生活愉快。

猜你喜欢

转载自blog.csdn.net/ftimes/article/details/107451492