C++ 中的类型转换 static_cast reinterpret_cast const_cast

#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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值