静态转换
格式:
static_cast<目标类型>(原始对象)
- 可以进行基础数据类型转换
- 父与子类型转换
- 没有父子关系的自定义类型不可以转换
例:
class Base{};
class Child:public Base{};
class Other{};
void test()
{
Base *base=NULL;
Child* child=NULL;
//把base转为Child*类型 向下转型 不安全
Child*Child2=static_cast<Child*>(base);
//把child 转为Base* 向上转型 安全
Base*base2=static_cast<Base*>(child);
//无效转换
//Other* other=static_cast<Other*>(base);
}
动态转换
格式:
dynamic_cast<目标类型>(原类型);
- 基础类型不可以转换
- 非常严格,失去精度或者不安全都不可以转换
父子之间可以转换
- 父转子不安全
- 子转父安全
- 如果发生了多态,都可以转换
class Base{
virtual void func() {};
};
class Child:public Base{
virtual void func() {};
};
class Other{};
void test()
{
Base* base = NULL;
Child* child = NULL;
//把base转为Child*类型 向下转型 不安全
//Child* Child2 = dynamic_cast<Child*>(base);
//把child 转为Base* 向上转型 安全
Base* base2 = dynamic_cast<Base*>(child);
Base* base3 = new Child;
Child* Child3 = dynamic_cast<Child*>(base3);
};
常量转换
常量转换(const_cast)
该运算符用来修改类型得const属性
常量指针被转化成非常量指针,并且仍然指向原来得对象
-
常量引用被转换成非常量引用,并且仍然指向原来得对象
例:
//取出const
const int * p=NULL; int *newp=const_cast<int *>(p)
//加上const
int * p=NULL; const int *newp=const_cast<cosnt int *>(p)
//不能对非指针或非引用的变量进行转换
//const int a=10; //int b=const<int>(a);错误
常量引用转换成非常量引用
int num=10; int &refNum=num; const int &refNum2=const_cast<const int&>(refNum);
注意:不能直接对非指针和非引用得变量使用const_cast操作符去直接移除它的const
重新解释转换(reinterpret_cast)
不推荐使用,最不安全,最鸡肋
int a=10;
int *p=reinterpret_cast<int*>(a);