C++的四种显示类型转换
来源:互联网 发布:平安科技 企业大数据 编辑:程序博客网 时间:2024/05/19 14:55
类型转换在我们编写程序时是不可避免的,比如我们分配一个内存区域,它将要存储的对象类型对编译器是不可知的。最典型的例子就是void*指针,调用malloc时会返回一个 void*,编译器并不知道void*指向的对象类型。
由此可见,类型转换时不可以或缺的!下面我们介绍C++提供的4种显示类型转换,及继承自C的类型转换方式(Type)expression。本文的主要内容如下:
static_cast(exp)显示转换
reinterpret_cast(exp)显式转换
dynamic_cast(exp)显示转换
const_cast(exp)显示转换
总结
1、写在前面
显示类型转换有时是必需的,如前面提到的void *指针。我们必须将malloc返回的void*指针显示转换为特定的类型,eg.:int * p=static_cast(malloc(100));还有如果我们想通过一个给定的十六进制数访问内存。这大大方便了我们编程,但同时也带来了风险,用得不好将成为很多错误的根源!如你通过一个十六进数去访问内存可能会导致程序崩溃;如你内存转换时可能会截断原有数据……
因此我们在类型转换时必须得小心。
2、static_cast(exp)显示转换
static_cast类型转换用于相关类型之间的转换,诸如:在同一个类的继承层次关系中,向上或向下转换;枚举类型与整数类型之间的转换;浮点类型与指数类型之间的转换。
在这4中类型转换中,static_cast是最接近C-style的了。
3、reinterpret_cast(exp)显式转换
字面理解即re-interpret,重新解析(释)的意思。故名思意,它主要用于不相关类型之间的转换,好一个英文单词在不同的上下文中,词性和词义可能完全不同。它为不同类型之间转换带来的便利,但是也伴随着风险的,如将一个十六进制整数转换为内存地址(由int-->指针类型,这两种类型完全不关联)。既然是用于不相关类型之间的转换,也就意味着编译器不会做太多的确认和承诺。
reinterpret_cast方式还有一个特点就是:目标和原始值之间至少有相同的位数,我们可以将转换之后的值再转换回去,而不像其它3种类型可能会导致精度丢失。
4、dynamic_cast(exp)显示转换
一种运行时(run-time)检测的类型转换,因此转换可能需要较大的运行时代价,这种类型也是用C-style是无法实现的。主要用于执行类型向下转换和继承之间的转换。
5、const_cast(exp)显示转换
用于消除变量的const限定,转换之后的变量就不再具有“const”了,如果是一个const指针的话,转换之后可以改变指向而指向其它对象。
6、总结
用C-style的(Type)expression的格式转换,可以用我们上面介绍的4种方式来替代。虽然中可以使用C-style的形式仍可用,但更加建议使用上面的4中类型。因为C-style的类型转换更加危险:
在一个大型程序中更难定位和识别
哪种类型转换并不明显
而用上面的四种方式可以更加准确地定位哪种类型转换发生了错误。
由此可见,类型转换时不可以或缺的!下面我们介绍C++提供的4种显示类型转换,及继承自C的类型转换方式(Type)expression。本文的主要内容如下:
static_cast(exp)显示转换
reinterpret_cast(exp)显式转换
dynamic_cast(exp)显示转换
const_cast(exp)显示转换
总结
1、写在前面
显示类型转换有时是必需的,如前面提到的void *指针。我们必须将malloc返回的void*指针显示转换为特定的类型,eg.:int * p=static_cast(malloc(100));还有如果我们想通过一个给定的十六进制数访问内存。这大大方便了我们编程,但同时也带来了风险,用得不好将成为很多错误的根源!如你通过一个十六进数去访问内存可能会导致程序崩溃;如你内存转换时可能会截断原有数据……
因此我们在类型转换时必须得小心。
2、static_cast(exp)显示转换
static_cast类型转换用于相关类型之间的转换,诸如:在同一个类的继承层次关系中,向上或向下转换;枚举类型与整数类型之间的转换;浮点类型与指数类型之间的转换。
在这4中类型转换中,static_cast是最接近C-style的了。
3、reinterpret_cast(exp)显式转换
字面理解即re-interpret,重新解析(释)的意思。故名思意,它主要用于不相关类型之间的转换,好一个英文单词在不同的上下文中,词性和词义可能完全不同。它为不同类型之间转换带来的便利,但是也伴随着风险的,如将一个十六进制整数转换为内存地址(由int-->指针类型,这两种类型完全不关联)。既然是用于不相关类型之间的转换,也就意味着编译器不会做太多的确认和承诺。
reinterpret_cast方式还有一个特点就是:目标和原始值之间至少有相同的位数,我们可以将转换之后的值再转换回去,而不像其它3种类型可能会导致精度丢失。
4、dynamic_cast(exp)显示转换
一种运行时(run-time)检测的类型转换,因此转换可能需要较大的运行时代价,这种类型也是用C-style是无法实现的。主要用于执行类型向下转换和继承之间的转换。
5、const_cast(exp)显示转换
用于消除变量的const限定,转换之后的变量就不再具有“const”了,如果是一个const指针的话,转换之后可以改变指向而指向其它对象。
6、总结
用C-style的(Type)expression的格式转换,可以用我们上面介绍的4种方式来替代。虽然中可以使用C-style的形式仍可用,但更加建议使用上面的4中类型。因为C-style的类型转换更加危险:
在一个大型程序中更难定位和识别
哪种类型转换并不明显
而用上面的四种方式可以更加准确地定位哪种类型转换发生了错误。
0 0
- C++的四种显示类型转换
- c++高级---C四种强制类型转换的总结
- C++【显示类型转换】
- 【C++】 四种强制类型转换
- C++的四种强制类型转换
- 四种强制类型转换的总结
- 四种强制类型转换的总结
- C++的四种强制类型转换
- C++的四种强制类型转换
- C++的四种强制类型转换
- C++的四种强制类型转换
- 四种常用的类型转换
- 四种强制类型转换的总结
- 四种强制类型转换的总结
- 四种强制类型转换的比较
- C++的四种强制类型转换
- C++的四种强制类型转换
- C++的四种强制类型转换
- 文档与文件比较工具简单汇总
- 数组中最小的K个数
- [SQL开发小技巧]一行拆分为多行
- The reflection of Java language (二)
- DevExpress Report 使用简要说明
- C++的四种显示类型转换
- PHP empty() 的判断
- 用 PHPRPC 实现 Ajax 级联下拉菜单
- 【雷电】源码分析(三)-- 游戏背景
- javascript 中的继承
- ios如何建立和调用静态库
- Python中采用命名管道来做多进程通信
- objective-c多线程编程的几种方法
- centos如何进入图形界面和centos已经进到图形界面后怎么打开命令行