细说C++类型转换操作符
作者:网络转载 发布时间:[ 2012/9/27 10:15:06 ] 推荐标签:
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的使用。
4、dynamic_cast
dynamic_cast用于子类和父类之间的转换,它可以将父类的指针或引用转换为子类的指针或引用。
dynamic_cast与前三种强制转换不同,它涉及运行时类型检查。如果绑定到引用或指针的类型对象不是目标类型的对象时,则dynamic_cast失败。当用于指针的转换失败时,dynamic_cast的结果为0,用于引用的转换失败时,则抛出一个bad_cast异常。
可用下面例子所用的结构对转换进行检测:
指针转换:
if(Derived *derviedPtr = dynamic_cast<Derived*>(basePtr){ // use the Derived object to which derivedPtr points } else{ // basePtr oiubsts at a Base object // use the Base object to which basePtr points } |
引用转换:
void f(const Base& b) { try{ const Derived& d = dynamic_cast<const Derived&>(b); // use the Derived object to which b referred } catch (bad_cast){ // handle the fact that the cast failed } } |
至此,转换操作符介绍完毕。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11