
隐试类型转换:
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;
