C++语言虽然兼容C,也支持C语言的类型转换用法,就是将类型用圆括号括起来,这种转换可视性比较差,难以跟踪错误的转换。C++提供了命名的强制转换操作符,毕竟转换有时是不安全的,所以使用命名转换操作符可以根据所使用的转换操作符可以判断风险级别。
下面我们就来看看C++提供的四种命名的强制转换操作符的具体功能和用法。
1、const_cast
2、static_cast
3、reinterpret_cast
4、dynamic_cast
这四个操作符的使用方法是相同的,都是cast-name<Type>(expression),Type是被转换值expression的目标类型。
下面看看这四个操作符分别的应用场合。
1、const_cast
顾名思义,const_cast就是将表达式的const性质去掉,例如
char* string_copy(char* s) { return s; } int main() { const char* pc_str; char* pc = string_copy(const_cast<char*>(pc_str));//如直接传入pc_str则编译错误 return 0; } |
上例只是说明问题,并不实现功能。
要记住,const_cast只能用来添加或删除const特性,同时添加或删除特性也只能用const_cast。
2、static_cast
这个用途比较广泛,编译器隐式执行的任何类型转换都可以有static_cast完成。
另外,static_cast多用于将一个void*类型的指针强制转换为原来的指针类型,例如:
double d = 12; void* p = &d; double* pd = static_cast<double*>(p); cout << *pd << endl; |
输出结果为12,说明转换后依然还是指向同一个地址。
3、reinterpret_cast
这个操作符很难看,也很难记,为什么呢,因为危险性比较大,设计成这个样子就是为了让我们尽量不用它,它用于对指针之间进行转换,例如:
int* ip; char* pc = reinterpret_cast<char*>(ip); string str(pc); |
虽然可以编译通过,但是却会带来严重的运行时错误,所以,要尽量避免reinterpret_cast的使用。