当前位置:  编程技术>c/c++/嵌入式

解析C++中四种强制类型转换的区别详解

    来源: 互联网  发布时间:2014-10-14

    本文导语:  C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢...

C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast
为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
四种转换的区别:
static_cast:可以实现C++中内置基本数据类型之间的相互转换。
代码如下:

int c=static_cast(7.987);

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数。
代码如下:

class A
{};
class B:public A
{};
class C
{};

int main()
{
    A* a=new A;
    B* b;
    C* c;
    b=static_cast(a);  // 编译不会报错, B类继承A类
    c=static_cast(a);  // 编译报错, C类与A类没有任何关系
    return 1;
}

const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
dynamic_cast:
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
        B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见)中,
        只有定义了虚函数的类才有虚函数表。
 (5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比               static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
参考例子:
代码如下:

#include
#include
using namespace std;
class A
{
   public:
   virtual void f()
   {
       cout

    
 
 

您可能感兴趣的文章:

  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • C++配置文件解析 C++ Configurator
  • C++ 解析器 Cling
  • xerces c++解析中文的问题
  • C++ 的 XML 解析器 slimxml
  • C++ 解析器线程的传播库 libpondyparser
  • C++的JSON解析类 JSONVALUE
  • C++命令行参数解析器 CLPP
  • C++多文件变量解析
  • 如何用C、C++解析HTTP请求报文,包括协议头,字符编码,请高手赐教。谢谢。
  • c++中#include <>与#include""的区别详细解析
  • C++空类默认函数详细解析
  • 解析C++浮点数无效值的定义与无效值判定的小结
  • linux 系统下c++ 用expat解析xml文件
  • C++标准库中sstream与strstream的区别详细解析
  • C与C++ 无参函数的区别解析
  • C++中overload,override,overwrite的区别详细解析
  • 解析使用C++编写无错代码的方法技巧
  • 解析C++ 浮点数的格式化显示
  • C++实现判断字符串是否回文实例解析
  • 解析c++中的默认operator=操作的详解
  • 解析取模运算% 和位与运算& 之间的关系详解
  • 解析Linux系统中JVM内存2GB上限的详解
  • ThinkPHP3.1新特性之内容解析输出详解
  • 解析C#彩色图像灰度化算法的实现代码详解
  • 解析C#中@符号的几种使用方法详解
  • 解析后台进程对Android性能影响的详解
  • 解析Android开发优化之:对界面UI的优化详解(三)
  • 解析在内部循环中Continue外部循环的使用详解
  • 解析使用enumerator模式简化异步操作的详解
  • jQuery解析JSON数据实例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C++中Operator类型强制转换成员函数解析
  • 解析PHP强制转换类型及远程管理插件的安全隐患
  • 使用libpcap读取tcpdump抓取的文件并解析c代码实例
  • 请教redhat9下什么命令执行arp解析和逆向arp解析
  • 基于Python的Html/xml解析库Beautiful Soup 4.2.1发布
  • 如何用libxml2 默认解析器解析HTML文件
  • html中<radio>单选按钮控件标签用法解析及如何设置默认选中
  • linux能否成为动态域名解析客户端的动态域名解析服务器?
  • Python下Html/xml解析库Beautiful Soup快速入门教程
  • 配置DNS服务器后,服务器可解析,客户端不能解析。求解
  • 基于Python的html解析库:pyquery最新版主页及pyquery下载
  • 为什么我在使用nslookup命令的时候,正向解析(域名-》ip)没有问题,反向解析(ip-》域名)怎么查不到呢?
  • python下xml解析库lxml最新版下载安装以及代码示例
  • 服务器本机能解析域名,其它机子都解析不到,能ping通dns服务器地址,是什么问题?//
  • python对XML的解析方法(SAX,DOM,ElementTree)介绍
  • 我有一个DNS服务器,既要解析自己局域网里IP,有要解析外网上的IP,如www.163.com,我该如何设置呢
  • php通过pack和unpack函数实现对二进制数据封装及解析
  • 请问怎样手工的解析XML文件啊.( 不借助任何的xml解析器)急!!!
  • html中<checkbox>标签用法解析及如何设置checkbox复选框的默认选中状态
  • 通过shell解析文件,并根据解析内容生成新的文件。
  • html中<select>标签用法解析及如何设置select的默认选中状态
  • java 公式解析 表达式解析 expression-analyzer
  • 请问各位:我用SUN公司的JAXP开发包解析XML文档,可不知道对XML解析后如何将结果写回文件中。请各位熟悉Java和XML的高手帮忙。




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3