现在的位置: 首页 > 综合 > 正文

const_cast、static_cast、reinterpret_cast用法(笔记)

2014年09月05日 ⁄ 综合 ⁄ 共 1401字 ⁄ 字号 评论关闭

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)

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

抱歉!评论已关闭.