1、静态转换 static_cast
static_cast 全部用于明确定义的变换,包括编译器允许我们所做的不用强制转换的“安全”变换和不太安全但清楚定义的变换。
static_cast包含的转换类型包括典型的非强制变换、窄化(有信息丢失)变换,使用void* 的强制变换、隐式类型变换和类层次的静态定位。
int i = 0x7fff;//32767 long l; float f; //Typical castless conversions: l = i; f = i; cout<<l<<endl; cout<<f<<endl; //Static_cast conversions: l = static_cast<long>(i); f = static_cast<float>(i); cout<<l<<endl; cout<<f<<endl; //Narrowing conversions: i = l; i = f; cout<<i<<endl; cout<<i<<endl; i = static_cast<int>(l); i = static_cast<int>(f); char c = static_cast<char>(i); cout<<i<<endl; cout<<i<<endl; cout<<i<<endl;
2、常量转换 const_cast
如果从const转换为非const 或 从volatile转换为非volatile, 可以使用const_cast 。这是const_cast 唯一允许的转换;如果进行别的转换就可能使用单独的表达式或者可能会得到一个编译错误。
const int a = 0; int* j = (int*)&a;// Deprecated form j = const_cast<int*>(&a);// Preferred //Can't do simultaneous additional casting: long* l = const_cast<long*>(&a); //Error//!“const_cast”: 无法从“const int *”转换为“long *” volatile int k = 0; int* u = const_cast<int*>(&k);
3、重解释转换 reinterpret_cast
这是最不安全的一种转换机制,最有可能出问题。reinterpret_cast把队形假想为模式(为了某种隐秘的目的),彷佛它是一个完全不同类型的对象。