一、C风格的强制类型转换
eg:
char *str = "hello";
void *p = (void *)str;
二、C++风格的强制类型转换
const_cast ,static_cast ,dynamic_cast ,reinterpret_cast
2.1 const_cast
功能:const_cast主要用于修改指针。例如const char *p形式
使用模板:
const_cast < 新类型 > ( 表达式 )
常用于:
- 常量指针转换成非常量的指针,并且仍指向原来的对象
- 常量引用转换成非常量的引用,并且仍指向原来的对象
2.2 static_cast
功能:static_cast的作用于C语言风格的强制类型转换效果基本一致
使用模板:
static_cast < 新类型 > ( 表达式 )
常用于:
- 类层次结构中基类和派生类之间的引用或者指针的转换
- 基本数据类型之间的转换
注:
- static_cast与C语言的强制类型转换一样,没有运行时类型检查,有安全隐患
- 基类与父类之间的转换,上行转换(派生类转为基类)是安全的;下行转换(基类转为派生类)是由于没有动态类型检查是不安全的
- 基本数据类型之间的转换的安全性需要开发者来进行维护
- static_cast不能转换掉原有类型的const、volatile、或者 __unaligned属性。(前两种可以使用const_cast 来去除)
- c++ primer 中说道:c++ 的任何的隐式转换都是使用 static_cast 来实现的
2.3 dynamic_cast
功能:沿继承层级向上、向下及侧向,安全地转换到其他类的指针和引用。
使用模板:
dynamic_cast < 新类型 > ( 表达式 )
-
新类型
:指向完整类型的指针,到完整类类型的引用,或指向(可选的cv限定)void的指针 -
表达式
:若新类型
为引用,则为完整类类型的左值(<C++11)/泛左值(>=C++11)表达式;若新类型
为指针,则指向完整类类型的指针纯右值
2.4 reinterpret_cast
功能:通过重新解释底层位模式在类型间转换。
使用模板:
reinterpret_cast < 新类型 > ( 表达式 )
参考文献
【1】c++ 四种强制类型转换介绍
【2】zh.cppreference.com/w/cpp/language/const_cast
【3】zh.cppreference.com/w/cpp/language/static_cast
【4】zh.cppreference.com/w/cpp/language/dynamic_cast
【5】zh.cppreference.com/w/cpp/language/reinterpret_cast
网友评论