static_cast
const_cast
dynamic_cast
reinterpret_cast
一.类型转换
表达式是否合法取决于操作数的类型,而且合法的表达式其含义也由操作数类型决定。在C++中,某些类型之间存在相关的依赖关系。若两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,则称这两个类型相关。
“转换”是一种编译器指令,大部分情况下他不改变一个指针所含的真正地址,他只影响“被指出之内存大小和其内容”的解释方式。
二.四种与类型转换相关的关键字
1.static_cast--运算符完成相关类型之间的转换
在同一类层次结构中的一个指针类型到另一个指针类型,整形到枚举,浮点型到整形等。
例:
int m=0;
double n=static_cast<int>m;
int *p=static_cast<int*>(malloc(100));
2.const_cast--移除变量的const或volatile限定符
//volatile:指令关键字,确保本条指令不会因为编译器的优化而省略,且要求每次直接读值
3.dynamic_cast--处理基类到派生类的转换(基类必须有虚函数,为多态时可以转换)
它是运行时进行类型检测的类型转换,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic——cast创建失败。
将基类的指针或引用安全地转换为派生类的指针或引用。当虚函数不能使用的时候,再使用dynamic_cast关键字,从基类指针获得派生类行为。
class Base
{
public:
virtual int test(){return 0;} //基类中存在虚函数,故在派生类中存在虚函数指针指向虚函数表。
};
class Derived:public Base
{
public:
virtual int test(){return 1;}
};
int main()
{
Base cbase;
Derived cderived;
Base *p1=new Base;
Base *p2=new Derived;
Derived* pD1=dynamic_cast<Derived*>(p1);//p1没有真正指向派生类,pD1置为0
Derived* pD2=dynamic_cast<Derived*>(p2); //正确
//Derived& pd1=dynamic_cast<Derived&>(*p1);//p1没有真正指向派生类,pd1抛出异常
Derived& pd2=dynamic_cast<Derived&>(*p2);//正确
return 0;
}
4.reinterpret_cast--处理互不相关类型之间的转换
它可以转换任何内置的数据类型为其他任何的数据类型,也可以转换任何指针类型为其他的类型。他甚至可以转换内置的数据类型为指针,无需考虑类型安全或者常量的情形,不到万不得已不使用它。
int a=10;
double *b=reinterpret_cast<double*>(a)//b的转换结果为0x0000000a