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)
前三种可以用旧式类型转换。