#include <iostream>
#include <cstdlib>
using namespace std;
void f1();
void f2();
int main()
{
/*
()强制转换,对数据直接进行转换
*/
double a=12.20;
int b=(int)a;
cout << "b=" << b << endl;
/*
转换时做静态检查,在编译时进行检查.
转换时不会做类型检查,需要使用者自己保证类型的正确性
void* 到其他的转换
*/
/*
string str1="123";
int i = static_cast<int>(str1);
cout << "i=" << i << endl;
*/
/*以上注释掉的转换引发下面编译时错误
cast.cpp: In function `int main()':
cast.cpp:23: error: invalid static_cast from type `std::string' to type `int'
*/
double d=3.1415;
int di=static_cast<int>(d); // double 到int 精度消失 运行时不做检查
cout << "di=" << di << endl;
int* p = static_cast<int*>(malloc(sizeof(int)*10));
double* pd = &d;
/*
允许强转任何类型的指针,或者将整数强转为指针,把指针强转成整数
将数据二进制的存在形式重新解释为目标类型;
*/
int* pi = reinterpret_cast<int*>(pd);
cout << pi << endl;
int pii = reinterpret_cast<int>(pi);
cout << pii << endl;
//以下两个函数去掉CV限制的转换
f1(); //输出67890 ,修改成功
f2(); //输出12345 ,值没有修改
}
void f1()
{
//volatile 易变的变量,防止编译器对常量进行优化
const volatile int CI = 12345;
//去掉CV限制
int* pci = const_cast<int*>(&CI);
*pci = 67890;
cout << "CI=" << CI << endl;
}
void f2()
{
//volatile 易变的变量,防止编译器对常量进行优化
//去掉volatile ,编译器将对常量进行优化,CI被初始化之后,
//第二次修改值的语句会被优化掉.
const int CI = 12345;
//去掉CV限制
int* pci = const_cast<int*>(&CI);
*pci = 67890;
cout << "CI=" << CI << endl;
}
C++ 中的类型转换 static_cast reinterpret_cast const_cast
最新推荐文章于 2020-08-16 08:03:27 发布