const_cast,移除const属性。
static_cast,父类->基类 普通类型之间的转换。
dynamic_cast,动态类型转换。如子类和父类之间的多态类型转换。
reinterpreter_cast,低级转换 执行取决编译器 不便移植 如一个pointer to int。
4种类型转换的格式,如:
const_cast
去掉类型的const或volatile属性。
const int a = 1;
int* p_a = const_cast<int*>(&a);
int& r_a = const_cast<int&>(a);
从一些 const TYPE ----> TYPE 。
static_cast
强制转换,无条件转换,静态类型转换。如下:1. 基类和子类之间转换:其中子类指针转换成父类指针是安全的。
Dervied* pd = new Dervied;
base* pb = static_cast<Base*>(pD);
先别想着Base->Dervied。(dynamic_cast)
2. 基本数据类型转换。 struct, int, char, float等。
int i = 0;
double d = static_castdouble>(i)
3. void* <----> TYPE*。
int* p = new int(1);
void* vP = static_cast<void*>(p);
int* iP = static_cast<int*>(vP);
dynamic_cast
安全的基类和子类之间转换,运行时类型安全检查,失败返回NULL:
在玩这个的时候用了vs试的,发现基类必须是有virtual属性。不然玩不了(不知道是c++标准规定还是编译器实现问题 待求证)。还没有用g++或者别的编译器试过。
class Base{
public:
Base(){}
virtual ~Base(){}
};
class dervied : public Base{
public:
dervied() {}
~dervied() {}
void show() {//dosomething}
};
//如下
{
Base* baseObj = new Base;
dervied* deObj = dynamic_cast<dervied*>(baseObj);
}
reinterpreter_cast
对类型的重现解释。
1. 转换类型为指针、引用、算术类型。 常见的用法是将指针转成同字节宽度的int型,然后还可以将int转换成指针,前提是同字节宽。
还有函数指针类型之间进行转换。
int a = 0;
int* pa = &a;
int result = reinterpret_cast<int>(pa);
printf("%d",result);
int* paRusult = reinterpret_cast<int*>(result);
int fun()
{
//do something
return 0;
}
void(*FuncPtr)();
FuncPtr = reinterpret_cast<void(*)()>(&fun);
(*FuncPtr)();
不同类型函数转换。
移除const属性用const_cast。
基本类型转换以及派生类到基类用static_cast。
多态类之间基类到派生类daynamic_cast(介意不要使用 成本太高了。)。
不同类型的指针以及到非指针类型转换用reinterpreter_cast。