const_cast、static_cast、reinterpret_cast用法(笔记)

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)

前三种可以用旧式类型转换。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值