C++强制转换
1非强制转换 char向int,double,float
Static_cast<int>( )
char a = 1;
int b = static_cast<int>(a);=1;
2使用void *的强制类型转换
struct callback_param
{
void *vp;
};
int a = 1;
struct callback_param cp;
cp.vp = &a; //编译器允许从任意类型指针向void*转换
pr=p; //error:不能将空类型指针赋给其他指针
int *ip = static_cast<int *>(cp.vp);
类型转换的意义是调用正确的重载函数
char buffer[5];
cout<<(void*)buffer;
输出buffer字符串的地址
error:stray'\243'in program是{},()的错误
int i;
float f = 166.7f;
i = static_cast<int>(f);
此时结果,i的值为166。
3常量转换(const_cast)
从const转换为非const,从volatile转换为非volatile。取得const对象的地址,会生成一个指向const的指针,volatile同。
一、常量指针被转化成非常量指针,并且仍然指向原来的对象;
二、常量引用被转换成非常量引用,并且仍然指向原来的对象;
三、常量对象被转换成非常量对象。
const int i = 0;
int *ip = const_cast<int *>(&i);
volatile int a = 0;
int *ap = const_cast<int *>(&a);
3、重解释转换(reinterpret_cast)
最不安全的一种转换机制,将对象转变为完全不同类型的对象,这是低级的位操作。
struct msg_hdr
{
int msg_type;
int msg_len;
char msg_data[0];
};
struct msg_data
{
int data1;
int data2;
};
struct msg_hdr *p = reinterpret_cast<struct msg_hdr *>(recvbuf);
struct msg_data *pdata = reinterpret_cast<struct msg_data *>(p->msg_data);
4