1、C++中有哪些类型转换
(1)static_cast:类似于C风格的强制转换。无条件转换,静态类型转换。主要用于
a.转换继承类的对象为基类对象
b.基本数据类型转换。enum, struct, int, char, float等。
c.把空指针转换成目标类型的空指针。
d.把任何类型的表达式转换成void类型。
因为这种转换一般会更改变量的内部表达方式,所以应用于指针类型转换没有太大意义。
例子:
//基本类型转换
int i=0;
double d = static_cast<double>(i); //相当于 double d = (double)i;
//转换继承类的对象为基类对象
class Base{};
class Derived : public Base{};
Derived d;
Base b = static_cast<Base>(d); //相当于 Base b = (Base)d;
(2)const_cast:去掉指针类型的const或volatile属性。出于安全性考虑,const_cast无法将非指针的常量转换为普通变量
struct SA {
int i;
};
const SA ra;
//ra.i = 10; //直接修改const类型,编译错误
SA &rb = const_castSA&>(ra);
rb.i = 10;
(3)dynamic_cast:有条件转换,动态类型转换,运行时类型安全检查(转换失败返回NULL):该函数只能在继承类对象的指针之间或引用之间进行类型转换。
1. 安全的基类和子类之间转换。
2. 必须要有虚函数。
3. 相同基类不同子类之间的交叉转换。但结果是NULL。
例:
class Base{};
class Derived : public Base{};
//派生类指针转换为基类指针
Derived *pd = new Derived;
Base *pb = dynamic_cast<Base*>(pd);
if (!pb)
cout << "类型转换失败" << endl;
//没有继承关系,但被转换类有虚函数
class A(virtual ~A();) //有虚函数
class B{}:
A* pa = new A;
B* pb = dynamic_cast<B*>(pa);
(4)reinterpret_cast:该函数将一个类型的指针转换为另一个类型的指针.
这种转换不改变指针变量值,只需在编译时重新解释指针的类型就可做到,可以将指针值转换为一个整型数,但不能用于非指针类型的转换.
例:
//基本类型指针的类型转换
double d=9.2;
double* pd = &d;
int *pi = reinterpret_cast<int*>(pd); //相当于int *pi = (int*)pd;
//不相关的类的指针的类型转换
class A{};
class B{};
A* pa = new A;
B* pb = reinterpret_cast<B*>(pa); //相当于B* pb = (B*)pa;
//指针转换为整数
long l = reinterpret_cast<long>(pi); //相当于long l = (long)pi;
2、为什么要用static_cast转换而不用c语言中的转换?
C语言中的强制类型转换,编译是不会报错的,这就留下了隐患,而static_cast在编译时进行了类型检查,直接报错,因此比较安全。