下面,主要介绍下C++中的reinterpret_cast<>重解释类型转换,它主要用于将一种类型的指针或者引用转换成另外一种类型的指针或者引用。
我们知道,int类型的数据可以隐式转换成double类型的数据,那么int*能否隐式转换成double*呢?
答案是否定的,编译出现以下错误:
那么用静态类型转换static_cast<>能否进行转换呢?将代码修改如下:
发现仍没有转换成功。因为静态类型转换在转换前,先要检查反方向能否隐式转换成功,很显然int*转成double*的反方向double*转成int*也无法隐式转换成功,所以static_cast<>对此也无能为力。
重新编译,转换成功:
接下来,请思考一下,这种重解释转换在实际开发中有什么用呢?
先看下面一个例子:
在网络编程中,很多时候我们通过socket传输过来一系列字节流,比如"liuzhihui\000123456\000",前面9位(包含‘\000’)表示账户名,后面7位(包含‘\000’),这是我们要解析出这些
字节流代表的数据,就可以通过重解释转换reinterret_cast<>:
通过重解释,我们就很方便的把字节流转换成我们自定义的结构体指针,可以快速的实现了字节流的解析
我们先看一个例子:
#include<iostream>
using namespace std;
int main()
{
int i=100;
int* pi=&i;
double* dpi=pi;
cout<<*pi<<endl;
return 0;
}
我们知道,int类型的数据可以隐式转换成double类型的数据,那么int*能否隐式转换成double*呢?
答案是否定的,编译出现以下错误:
Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
reinterret_cast.cpp: In function ‘int main()’:
reinterret_cast.cpp:8: 错误:不能将‘int*’转换为‘double*’,在 initialization 中
那么用静态类型转换static_cast<>能否进行转换呢?将代码修改如下:
#include<iostream>
using namespace std;
int main()
{
int i=100;
int* pi=&i;
double* dpi=static_cast<double*>pi;
cout<<*pi<<endl;
return 0;
}
发现仍没有转换成功。因为静态类型转换在转换前,先要检查反方向能否隐式转换成功,很显然int*转成double*的反方向double*转成int*也无法隐式转换成功,所以static_cast<>对此也无能为力。
[Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
reinterret_cast.cpp: In function ‘int main()’:
reinterret_cast.cpp:8: 错误:从类型‘int*’到类型‘double*’中的 static_cast 无效
这时我们就需要利用reinterpret_cast<>重解释转换:
#include<iostream>
using namespace std;
int main()
{
int i=100;
int* pi=&i;
double* dpi=reinterpret_cast<double*>(pi);
cout<<*dpi<<endl;
return 0;
}
重新编译,转换成功:
[Hyman@Hyman-PC cplus]$ g++ reinterpret_cast.cpp -o reinterpret
[Hyman@Hyman-PC cplus]$ ./reinterpret -0.0128227
接下来,请思考一下,这种重解释转换在实际开发中有什么用呢?
先看下面一个例子:
在网络编程中,很多时候我们通过socket传输过来一系列字节流,比如"liuzhihui\000123456\000",前面9位(包含‘\000’)表示账户名,后面7位(包含‘\000’),这是我们要解析出这些
字节流代表的数据,就可以通过重解释转换reinterret_cast<>:
#include<iostream>
using namespace std;
int main()
{
char* message="liuzhihui\000123456\000";
struct Msg
{
char name[10];
char password[7];
};
Msg* pmsg=reinterpret_cast<Msg*>(message);
cout<<pmsg->name<<","<<pmsg->password<<endl;
return 0;
}
通过重解释,我们就很方便的把字节流转换成我们自定义的结构体指针,可以快速的实现了字节流的解析
[Hyman@Hyman-PC cplus]$ ./reinterpret
liuzhihui,123456