显式转换,又称强制转换
显式转换尽可能少用,如果程序使用了大量显式转换,本身就是程序设计有问题,显式转换是告诉程序读者和编译器,此处存在安全隐患
static_cast,静态转换
class B
{
};
class D : public B
{
};
int main()
{
int i;
double d;
i = static_cast<int>(d);
d = static_cast<double>(i);
int *pi;
double *pd;
void *pv;
pv = pi;
pv = static_cast<void *>(pi);
// pd = pv;
pd = static_cast<double *>(pv);
const int *pci = &i;
pci = static_cast<const int *>(&i);
B objb;
D objd;
objb = objd;
//objd = objb;
objb = static_cast<B>(objd);
// objd = static_cast<D>(objb);
B *pobjb;
D *pobjd;
pobjb = pobjd;
// pobjd = pobjb;
pobjb = static_cast<B *>(pobjd);
pobjd = static_cast<D *>(pobjb);
B &rb = static_cast<B &>(objd);
D &rd = static_cast<D &>(objb);
return 0;
}
总结
适用static_cast情形
所有隐式转换
void *转其他类型指针
基类指针转派生类指针(不安全)
基类转派生类引用(不安全)
dynamic_cast,去除指针和引用目标对象的const属性
const_cast
int i;
const int ci = i;
int *pi;
const int *pci;
pi = &i;
pci = &ci;
// pi = &pci;
pi = const_cast<int *>(pci);
//int &ri = ci;
int &ri = const_cast<int &>(ci);
总结
适用const_cast情形
指向const对象指针转指向普通对象指针
const对象绑定到普通对象引用
记住:引用的本质是指针,表面把对象赋给引用,本质把对象地址赋给指针
reinterpret_cast