C++是一门强类型语言,一般不支持强制类型转换,但本语言内部提供了类型转换符用于不同类型间的转换
1、const_cast:去掉类型的const或volatile属性
常用于:
1、常量指针被转换成非常量指针,仍指向原来的对象
2、常量引用被转换成非常量引用,仍指向原来的对象
3、常量对象被转换成非常量对象
int main(void)
{
const int a = 100;
//a = 200; 直接修改const类型,编译错误
int &b = const_cast<int&>(a);
b = 200; //正确
}
2、static_cast:类似域c风格的强制转换,无条件转换,静态类型转换。
常用于:
1、父类和子类之间的转换:其中子类指针转换成父类指针是安全的。但反之不安全
注:父类与子类中之间的动态转换建议使用dynamic_cast
2、基本类型之间的转换,如:enum、int、float、int、char等
3、把空指针转换成目标类型的空指针
4、把任何类型的表达式转换成void类型
注:static_cast不能进行无关类型指针的转换(如:没有关联的类之间的转换)
int main(void)
{
int n = 6;
double d = static_cast<double>(n); //基本类型的转换
int *pn = &n;
//double *dd = static_cast<double*>(&n); 错误,不可进行无关类型指针的转换
void *p = static_cast<void*>(pn); //把任意类型转换成void类型
}
3、reinterpret_cast:主要用于指针的转换
转换的类型必须是一个指针、引用、算数类型、函数指针或者成员指针。
注:最普通的用途就是函数指针类型之间的转换。
#include <iostream>
using namespace std;
typedef void (*FunPtr)(int x,int y);
int add(int x,int y)
{
cout << x + y << endl;
}
void fun(int x,int y,FunPtr pp)
{
pp(x,y);
}
int main(void)
{
FunPtr p = reinterpret_cast<FunPtr>(add);
fun(2,3,p);
return 0;
}
4、dynamic_cast:有条件转换,动态类型转换,运行时进行类型安全检查(转换失败返回NULL)
常用于:
1、安全的父类和子类之间的转换
2、必须要有虚函数
3、相同父类不同子类之间的交叉转换,但结果是NULL
注:当转换时不安全是自动置NULL
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun()
{
cout << "void A::fun()" << endl;
}
};
class B:public A
{
public:
void fun()
{
cout << "void B::fun()" << endl;
}
};
int main(void)
{
A *a = new A;
B *b = dynamic_cast<B*>(a);
if(b == NULL)
{
cout << "================" << endl; //此条语句会执行
}
}