shellmad-09_C++新特性 强制转换reinterpret_cast

reinterpret_cast

等价于C语言中的类型转换

int main(){
	int n = 1;
	int* p = n;	
}

按道理, 应该无法转换
然后强制转换, 解决问题

int main(){
	// 显式强转
	int n = 1;
	int* p = (int*)n;	
}

C++为了统一, 也还是创建了一个转换方式, 来替换强转
跟显示的强转, 没有任何区别, 只是看起来更加的清晰而已, 可读性更好

用于高风险的转换方式

整形转指针
各种类型的指针转换
父类, 子类指针的转换

int main(){
	// 显式强转
	int n = 1;
	// 整形转指针
	int* p = reinterpret_cast<int*>(n);	
	// 各种类型的指针转换 int*->char*
	char* pCh = reinterpret_cast<char*>(p);
	// 父类, 子类指针的转换
	
}

以下编译通过, 很显然, 这种转换方式, 不存在检查
汇编图
在这里插入图片描述

#include <iostream>
using namespace std;
class CFather{

};
class CSon: public CFather{

};

int main(){
	CSon* pSon;
	CFather* pFather;

	pSon = reinterpret_cast<CSon*>(pFather);
	return 0;
}
  • 用于进行各种不同类型的转换
    • 不同类型指针之间
    • 不同类型引用之间
    • 指针和能容纳指针的整数类型之间的转换
  • 编译期处理,执行的是逐字节复制的操作
  • 类似于显式强转,后果自负
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

void foo(){
    cout << "foo()" << endl;
}

int main() {
    int nTemp = 0;

    // 指针转整数
    int nTemp1 = reinterpret_cast<int>(&nTemp);
    cout << hex << nTemp1 << '\n';

    //整数转指针
    int* p1 = reinterpret_cast<int*>(nTemp1);
    cout << *p1 << '\n';

    //将整型转为指针
    unsigned int nTemp2 = 0x00500000;
    int* pTemp = reinterpret_cast<int*>(nTemp2);

    //将一个函数转为一个函数指针并转回
    void(*fp1)() = reinterpret_cast<void(*)()>(foo);
    int(*fp2)() = reinterpret_cast<int(*)()>(fp1);

    cout << dec << fp2() << '\n'; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值