目录
const_cast : 去掉(指针或者引用)常量属性的一个类型转换
static_cast : 提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了,就编译不通过)
reinterpret_cast : 类似于C风格的强制类型转换,谈不上什么安全
dynamic_cast : 主要用在继承结构中,可以支持RTTI类型识别的上下转换
const_cast:
const_cast<这里面必须是指针或者引用类型 int* int&>
const_cast在进行类型强转的时候,地址a的类型是和左边的类型和<>里面的去掉常量的类型是要保持一致的(在这里就是只能转换为
int*
类型)double *p1 = const_cast<int*>(&a); //erro int *p1 = const_cast<int*>(&a); //accept
static_cast:
提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了,就编译不通过)
基本上可以实现全部类型的转换,并不能实现全部的,需要使用者自己确定。
static_cast可以在基类和派生类之间使用
- 因为基类类型和派生类类型是继承结构上从上到下的类型。
- 类型强转的时候,它们类型之间是有关系联系的。
- static_cast可以通过它们之间的互相转换,但是转换之后,代码到底安不安全是由开发者来保证,而不是由static_cast保证。
reinterpret_cast:
就是随意转了,没有任何安全可言
dynamic_cast:
主要用在继承结构中,可以支持RTTI类型识别的上下转换
#include <iostream> using namespace std; class Base//抽象类 { public: virtual void func() = 0; }; class Derive1 : public Base { public: void func() { cout << "call Derive1::func" << endl; } }; class Derive2 : public Base { public: void func() { cout << "call Derive2::func" << endl; } //Derive2实现新功能的API接口函数 void derive02func() { cout << "call Derive2::derive02func" << endl; } }; /* typeid(*p).name() == "Derive" */ void showFunc(Base* p) { //dynamic_cast会检查p指针是否指向的是一个Derive2类型的对象? //通过p访问->vfptr访问->vftable RTTI信息 如果是,dynamic_cast转换类型成功, //返回Derive2对象的地址,给pd2;否则返回nullptr //static_cast是编译时期的类型转换 dynamic_cast是运行时期的类型转换,是支持RTTI信息识别的 Derive2* pd2 = dynamic_cast<Derive2*>(p); if (pd2 != nullptr) { pd2->derive02func(); } else { p->func();//动态绑定 *p的类型 Derive2 derive02func } } int main() { Derive1 d1; Derive2 d2; showFunc(&d1); showFunc(&d2); return 0; }
这里使用
dynamic_cast
进行转换是为了进行运行时类型检查。如果p
指针指向的实际对象的类型是派生类Derive2
或其派生类,那么转换将成功,pd2
将指向有效的对象。否则,如果类型不匹配,转换将返回空指针(nullptr)这里使用一个dynamic_cast转换,执行过程中程序会优先尝试将传入的基类指针转化为Derive2类型的,如果传入的p是
Derive2
则转换成功,可以使用这个指针去调用基类函数,执行不同的函数获得不同的结果。
implicit_cast:
并不是 C++ 标准库中的函数或类型,而是一种编程技巧,通常用于进行隐式类型转换,类似于 C++ 中的强制类型转换。
template <typename To, typename From>
inline To implicit_cast(From const &f) {
return f;
}
在这个定义中,implicit_cast 接受一个源类型 From 的常引用,并将其隐式地转换为目标类型 To。实际上,这个函数不会进行任何实际的转换操作,只是通过返回源类型的引用/值,让编译器根据类型的兼容性进行隐式转换。
通常情况下,implicit_cast 用于在不进行明确类型转换的情况下,进行编译器认可的类型转换,从而减少代码中显式类型转换的使用。这有助于提高代码的可读性和安全性。