隐试类型转换:
char c = 'A';
int x = c; //隐试类型转换
cout << x << endl;
显式类型转换:
//强制类型转换
char c = 'A';
int x = (int)c; //C风格
int y = int(c);//C++风格
C++扩展了四种操作符形式的转换:
//1.静态类型转换:static_cast
//语法:目标变量=static_cast<目标类型>(源类型变量);
//适用场景:将void*转化为其它类型的指针
int* pi = NULL;
char c = long(pi);
//强制类型转换这种不合理的转换可以通过
//char c2= static_cast<long>(pi);
//不合理的转换会报错--编译器会自动检查是否合理
void* pv=pi;
//pi = pv; 错误
//void*不能隐试转换成其它类型的指针
pi = static_cast<int*>(pv);//将void*转化为其它类型的指针
//2.动态类型转换:dynamic_cast
//语法:目标变量=dynamic_cast<目标类型>(源类型变量);
//后面讲
//3.去常类型转换:const_cast
//语法:目标变量=const_cast<目标类型>(源类型变量);
//目标类型 必须是指针
//适用场景:主要用于去掉指针或引用的const属性
volatile const int i = 100;
//int* pi = &i; 错误,因为i是const,相当于常量,不能保存常量地址
int* pi= const_cast<int*>(&i); //通过const_cast的转换,去掉变量i的const属性后再赋值
*pi = 200;
cout << "*pi=" << *pi << "," << "i=" << i << endl;
/*
特殊注意:
const的变量值第一次读取后会放到寄存区里,以后都从寄存器里,这样执行效率高
volatile的作用:使用该变量时,每次都从内存读取,而不是读取寄存器中的副本,这样保存const_cast转换后*pi的值和i的值相同
*/
cout << "pi=" << pi << "," << "&i=" << (int*)&i << endl;
//&i=1 是编译器的错,把它转换成布尔类型了,强制类型转换一下就OK了
//4.重解释类型转换:reinterpret_cast
//语法:目标变量=reinterpret_cast<目标类型>(源类型变量);
//适用场景一:指针和整形数进行转换
//int* p = 0x12345678; 错
int* p= reinterpret_cast<int*>(0x12345678);//把整形数转换成地址
//适用场景二:任意类型指针或引用之间转换
char buf[] = "0001 0012345678 00123456";
//" 00"-->' '
struct A {
char type[5];
char id[9];
char passwd[7];
};
A* a= reinterpret_cast<A*>(buf);//把buf指针转换成A*指针
cout << a->type << endl;
cout << a->id << endl;
cout << a->passwd << endl;