1.const_cast:
#include <iostream> using namespace std; void fun(int &val) { cout<<"fun "<<val<<endl; } //const_cast用来移除常量性 //const_cat一般用于指针或者引用 //使用const_cast去除const限定的目的不是为了修改它的内容 //使用const_cast去除const限定,通常是为了函数能够接受这个实际参数 int main(void) { const int val = 100; // int n = const_cast<int>(val); int n = val; // int* p = &val; Error,无法从const int*转换为int* int* p = const_cast<int*>(&val); *p = 200; cout<<&val<<endl; cout<<p<<endl; cout<<"val="<<val<<endl; //val为100,值不变 const int val2 = 200; // fun(val2); error C2664: “fun”: 不能将参数 1 从“const int”转换为“int &” fun(const_cast<int&>(val2)); int& refval2 = const_cast<int&>(val2); refval2 = 300; cout<<"val2="<<val2<<endl; //val2为200,值不变 return 0; }
2:static_cast:
#include <iostream> using namespace std; //补充 隐式转换 编译器可以自动完成(一般来说是完全的) int a;short b; a=b //编译器隐式执行的任何类型都可以用static_cast来转换 //将一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换 //可以将void*指针转换成某一类型的指针 //可以将基类的指针指向派生类指针 //无法将const转化为nonconst,这个只有const_cast办得到 int main(void) { int n = static_cast<int>(3.14); cout<<"n="<<n<<endl; void* p = &n; int* p2 = static_cast<int*>(p); return 0; }
3:reinterpret_cast:
#include <iostream> using namespace std; //reinterpret_cast “通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在的形式重新解释 int main(void) { int i ; char *p = "this is a example."; i= reinterpret_cast<int>(p); //此时结果,i与p的值是完全相同的 int* ip; char* pc = reinterpret_cast<char*>(ip);//pc所指向的真实对象是int型,并非字符串 //如果将pc当做字符指针进行操作,可能会造成运行时错误 //如int len = strlen(pc); return 0; }
新的类型转换运算符:
const_cast<T>(expr)
static_cast<T>(expr)
reinterpret_cast<T>(expr)
dynamic_cast<T>(expr)
前三种可以用旧式类型转换。