四个cast的形式:T t = xx_cast<T>(expression)
不要忘了expression要用括号隔开,不向sizeof
const_cast: 去掉const修饰,即用来将指向const对象的指针转为指向普通对象的指针
T t;
T const * const_pt = &t;
T *pt = const_pt; //error
T *pt2 = const_cast<T*>(const_pt); //ok
其它的cast不能去掉const修饰。
static_cast: 将隐式转换显示话。
隐式转换有:standard :int -> double
user-define : 通过类的构造函数、重载conversion编译器可以将一种类型转为另一种类型
这个要求两类型间能够作隐式转换。如果这个不符,则编译通不过。
如:T t;
t = 3; //3 -> T
t = static_cast<T>(3);
这个使程序更清晰,不用也行。
dynamic_cast:将指向类型T的指针(或引用)转为指向类型S的指针(或引用)。
要求两类型都为class,且待转换的类型T为多态类型,即含virtual成员函数,如果不是,则编译通不过;目标类型不必是多态类型。
如果待转换的指针指向的对象是一个目标类型(比如为其子类)的对象,则转换成功;否则转换失败,返回0.
class Base
{
public: ~Base(){}
};
class Derived: public Base {};
Base b;
Base *pb = &b;
Derived *pd = dynamic_case<Derived*>(pb); //待转换的类型为Base *,为多态类型
reinterpret_cast:无理转换。即要求编译器将两种无关联的类型作转换。
char *buf = new char[1024];
T *bt = reinterpret_cast<T*>(buf); //T与char无关联
T *bt = (T*)(buf); //这个是c-style
上面的4种cast都可以用c-style的风格写:T t = (T)(expression);