C++中有四种类型转换方式.如下:
static_cast :简单的转换
const_cast :去掉const
dynamic_cast :类的转换
reinterpret_cast :不同类型强制转换(很容易出错的)
1.static_cast : 使用简单,易理解…类型转换
1 2 3 4 5 6 7 8 9 10 11 12 |
#include<iostream> using namespace std; int main() { int i = 2; float f; f = (float)i; cout << f << endl; f = static_cast<float>(i); cout << f << endl; } |
2.const_cast :去掉指针的const…
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> using namespace std; int main() { int A = 3; const int * a = &A; //*a = 4; int *ptr = const_cast<int*>(a); cout << * ptr << endl; *ptr = 4; cout << * ptr << endl; } |
3.dynamic_cast :较复杂。它与static_cast相对,是动态转换。
这种转换是在运行时进行转换分析的,并非在编译时进行,明显区别于上面三个类型转换操作。
该函数只能在继承类对象的指针之间或引用之间进行类型转换。进行转换时,会根据当前运行时类型信息,判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null检测,引用转换失败则抛出一个bad_cast异常。
从基类转化为子类的指针的时候,要求基类有虚函数(virtual)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include<iostream> using namespace std; class Base { public: Base() = default; virtual ~Base() = default; }; class Drived : public Base { }; int main() { cout << sizeof(Drived) << endl; dynamic_cast<Drived*> (new Base); dynamic_cast<Base*> (new Drived); } |
4.reinterpret_cast :该函数将一个类型的指针转换为另一个类型的指针.
这种转换不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可做到.
reinterpret_cast 可以将指针值转换为一个整型数,但不能用于非指针类型的转换.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include<iostream> using namespace std; int main() { // int i; // char *ptr="hello freind!"; // i = reinterpret_cast <int> (ptr); double d=9.2; double* pd = &d; int *pi = reinterpret_cast<int*>(pd); cout << *pi << endl; } |
大致是以上四种,使用频率越来越少吧…
【C++】C++中的四种类似转换方式