C++中提供了以下几种类型转换运算符
•static_cast<类型>()
–转换时做静态检查,即在编译时进行
–void*到其他指针的转换
•reinterprect_cast<类型>()
–允许强转任何类型的指针
–把整数强转成指针,指针强转成整数
•const_cast<类型>()
–去掉cv限制
•dynamic_case<类型>()
–动态转换
以下是详细代码:
/
//类型转换
#include <iostream>
using namespace std;
int main(){
//
double pi = 3.1415926;
cout << "要转的内容 " << pi << endl;
//强转
int x = pi;
cout << "强转 " << x << endl;
//C++提供的转换方式
cout << "========== 法一 static_cast ===========" << endl << endl << endl;
/*
*
*
*
static_cast<类型>()
转换时做静态检查,即在编译时进行
void*到其他指针的转换
*
*
*
*/
// 要转的类型 要转的内容
int y = static_cast<int>(pi);
cout << "C++提供的转换方式 " <<y << endl;
// void* 可以指向任意类型
void* pc = new long(12345);
long* pl = static_cast<long*>(pc);
cout << "任意类型本指向long类型的 现在也可以转成long* :" << *pl << endl<< endl << endl;
//long类型的指针 转换成 double类型的指针 不合理
//double *pdd = pc;//强转都不行
//static_cast 转换会做类型检查 合理就转,否则会拒绝操作
// double* pd = static_cast<double*>(pl);
cout << "========== 法二 reinterpret_cast ===========" << endl << endl;
/*
*
*
*
reinterprect_cast<类型>()
允许强转任何类型的指针
把整数强转成指针,指针强转成整数
比较强悍,你想转它就帮你转,但是不对结果负责
*
*
*
*/
double* pd = reinterpret_cast<double*>(pl);
cout << "reinterprect_cast转换前:" << *pl << endl;
cout << "reinterprect把long类型强转成double指针后:" << *pd << endl << endl;
cout << "========== 法三 const_cast ===========" << endl << endl;
/*
*
*
*
法三
const_cast<类型>()
去掉 c v 限制
const volatile
*
*
*
*/
//编辑器在这里发现 a 是const类型,它就认为 a 不可修改,所以在下面只要出现 a 它都会去用 200 来替换
//volatile 告诉编译器该 const 类型变量,有可能进行修改,在使用时去内存中查找真实数据
volatile const int a = 100;
//a++;//这样的a修改不了 因为类型不允许
//(但是其实取到内存还是可以修改的)
//&a 类型是const int*
// int* pa = &a; //取a的地址
//const int* pa = &a;//const修饰指针 说明指针指向的那块空间不能改 ???
//*pa = 200;//这样不行 是因为pa指针是用const修饰的了
//去掉const
int* pa = const_cast<int*>(&a);
*pa = 300;
cout << "const_cast去掉cv限制: a = " << a << endl;//在这里打印的时候还是100貌似没改变 实际上是编译器一开始看到a是const所以它自以为a是不能变的,在接下来用到a的地方都把100替换 我们应该告诉编译器去地址里面取值
return 0;
}