1、命名的强制转换类型转换
1.1一般形式 : cast_name<type>(expression);
type:转的目标类型。expression则是被强制转的值。
cast_name有分为:
(1)dynamic_cast:支持运行时识别指针或引用所指向的对象,这个会在后边介绍。
(2)const_cast:只能用来添加或删除const特性。如:
//假设string_copy函数只接收char*类型参数
const char *pc_str;
char *pc = string_copy(const_cast<char*>(pc_str);
考虑,下边的转换是否正确。char *pc = const_copy<char*>(pc_str);
在我看来,这个是有问题的,首先pc_str是指向const类型的指针,将这个指针的值强制转换赋值给pc,使一个指向char的指针指向了const char。实际编译中,这个是正确的。不是很了解,求解答。
(3)static_cast:编译器隐式执行的任何类型转换都可由其显示完成。当显示地提供强制类型转换时,警告信息将被关闭。如:
double d = 97.3;
char ch = static_cast<char>(d);
若编译器不提供自动转换,也用static_cast来执行类型转换,如://用static_cast找回存放在void*指针中的值
unsigned ni(1000);
void *p = ∋
unsigned *np = static_cast<unsigned *>(p);
(4)reinterpret_cast:为操作数的位模式提供较低层次的重新解释。如:
int *ip;
char *pc = reinterpret_cast<char *>(ip);
程序员必须永远记得PC所指向的真实对象其实是int型,而并非char型。任何假设pc是普通字符指针的应用,都可能带来运行错误。
建议:尽量避免强制类型转换,这是由于强制类型转换将关闭警告信息。