除非必要,尽量不要对变量进行强制转换。这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的。

旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语法结构在C++的任何地方都有可能使用,这就无法直观的判断出是否是转型操作。

在C++中,旧式的C转型方式并非是唯一的选择方式,我们有了新式的类型转换,与老式的C转换允许将任何类型转换为任何其他类型这种释放拙劣的行为相比,C++引入的新式的转换方式可精确地指明转换的意图。

1.static_cast

static_cast<type-id>(expression)  该运算符把expression转换为type-id类型,但没有运行时的类型检查来保证转换的安全性。

int fistNum,secondNum;                        int fistNum,secondNum;

double res = (double)firstNum/sencondNum;   //旧式转换      double res = static_cast<double>(firstNum)/secondNum; //新式转换

static_cast用途比较广泛,编译器隐式执行的任何类型转换都可使用其来实现,几种用法如下

(1)用于类层次结构中基类和子类之间指针或引用的转换

(2)进行上行转换(把子类的指针或引用转换成基类表示)是安全的

(3)把空指针转换成目标类型的空指针

(4)把任何类型的表达式转换成void类型

(5)static_cast不能转换掉expression的const,volitale或_unaligned属性

(6)进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

(7)static_cast可用于将一个void*类型的指针强制转换为原来的指针类型,例如:

double d = 12;

void* p = &d;

double* pd = static_cast<double*>(p);

cout<<*pd<<endl;  输出结果12,说明转换后依然指向同一个地址。用于基本数据类型之间的转换。进行下行转换(把基类指针或引用转换成子类表示)

2.dynamic_cast

dynamic_cast<type-id>(expression)  该运算符把expression转换成type-id类型的对象。type-id必须是类的指针,类的引用或void*

如果type-id是类指针类型,那么expression也必须是一个指针

如果type-id是一个引用,那么expression也必须是一个引用

dynamic_cast要求派生类要有虚拟函数,否则编译不能通过

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

3.reinterpret_cast

reinterpret_cast<type-id>(expression)

type-id必须是一个指针,引用,算术类型,函数指针或者成员指针。例如:reinterpret_cast可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)

reinterpret_cast比static_cast更接近C的强制转换。它可以实现看起来没任何关系的两种类型的转换,当然它比static_cast危险

除非有必要,否则在C++编程中应尽量避免使用reinterpret_cast

static_cast在编译时使用类型信息执行转换,在转换执行必要的检测(诸如越界计算,类型检查)时,其操作数相对是安全的。reinterpret_cast仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换,例如:

int n = 9;

double d = static_cast<double>(n);

将一个变量从int转换到double,这种类型的二进制表达式是不同的。要将整数9转换到双精度整数9,static_cast需要正确地为双精度d补足比特位,其结果为9.0,而reinterpret_cast不会有这样的操作。

4.const_cast

const_cast<type-id>(expression)  主要用来修改类型的const或volatile属性,在使用过程中,除了const或volatile修饰之外,type-id和expression的类型是一样的。

尽管类型转换操作符的方式没有非常明显的优势,但还是建议在C++工程中尽量避免C风格的类型转换。使用类型转换操作符的方式进行类型转换,是一种好的编码习惯

由于强制类型转换无所不能,所以无形中会给C++程序带来很大的安全隐患。因此建议在C++代码中使用C++提供的除reinterpret_cast以外的3种转换方式。除非必要,否则应禁止使用强制类型转换和reinterpret_cast;

static_cast,const_cast,dynamic_cast,reinterpret_cast的更多相关文章

  1. c++强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)

    static_cast <typeid>(exdlvssion) static_cast 很像 C 语言中的旧式类型转换.它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户 ...

  2. C++提供的四种新式转换--const_cast dynamic_cast reinterpret_cast static_cast

    关于强制类型转换的问题,许多书都讨论过,写的最具体的是C++之父的<C++的设计和演化>. 最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_c ...

  3. static_cast、dynamic_cast reinterpret_cast

    关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的<C++ 的设计和演化>.最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_ ...

  4. c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast

    c++ 数据类型转换: static_cast dynamic_cast reinterpret_cast const_cast  [版权声明]转载请注明出处 http://www.cnblogs.c ...

  5. static_cast、dynamic_cast、reinterpret_cast、const_cast以及C强制类型转换的区别

    static_cast 1. 基础类型之间互转.如:float转成int.int转成unsigned int等 2. 指针与void*之间互转.如:float*转成void*.CBase*转成void ...

  6. C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

    1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 ...

  7. C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)

    C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...

  8. C++的类型转换:static_cast、dynamic_cast、reinterpret_cast和const_cast

    在C++中,存在类型转换,通常意味着存在缺陷(并非绝对).所以,对于类型转换,有如下几个原则:(1)尽量避免类型转换,包括隐式的类型转换(2)如果需要类型转换,尽量使用显式的类型转换,在编译期间转换( ...

  9. static_cast、dynamic_cast、reinterpret_cast、和const_cast

    关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的<C++ 的设计和演化>.最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_ ...

随机推荐

  1. jQuery插件

    1. Lightbox 2:    Lightbox 2 是一款很酷的图片显示插件,可以在一个平滑展开的新窗口中展现出图片,而同时页面的其余部分都变成黑色背景.使用这款插件,是为了当你的的图片过大必须 ...

  2. 关于iOS9中的App Transport Security相关说明及适配(转)

    原文:http://my.oschina.net/vimfung/blog/494687 iOS9中新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的H ...

  3. UCS2转UTF-8方法

    前两天工作时需要将UCS2编码转为UTF-8编码在网页显示.网上找了好久没有好方法,后来还是同事给了一个自己的函数,顺利解决问题.把函数贴在这里,愿帮助遇到同样问题的工友们~ /**      * U ...

  4. 《think in python》学习-1

    高能提示:本文大量编程术语与释义,一些释义如有偏差恕不讨论. 纠结学Python 很久了,一年的纠结过程中慢慢的积累了一点对python的认知,但实际语法都未曾接触过,研究backbone的一个例子的 ...

  5. JAVA读取propertise配置文件

    java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是"key=value"的格式,在pr ...

  6. C#用网易邮箱发送邮件(同步异步)

    SmtpClient smtpServer = new SmtpClient("smtp.163.com"); smtpServer.Port = ; smtpServer.Cre ...

  7. Win32应用程序的基本结构

    0 引言 Win32 API是用于创建 Windows 应用程序的应用程序编程接口.通常情况下,一个Win32应用包含一下几个部分: 1)    应用程序入口: 2)    注册窗口类: 3)    ...

  8. leetcode Trapping Rain Water pthon

    class Solution(object): def trap(self,nums): leftmosthigh = [0 for i in range(len(nums))] leftmax=0 ...

  9. JVM学习之GC参数设置

    1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx2g b: -Xms 指定jvm的最小heap大小,如:-Xms1g c: -Xmn 指定jvm中New Gener ...

  10. css书写顺序和常用命名推荐

    写代码的时候有一个好的规范和顺序能够帮你节省很多时间.下文将推荐相关CSS书写顺序和规范的一些方法.这个文档将会整理进前端规范文档中,如果你有更好的意见,不妨留言告知我们. CSS书写顺序 该代码来自 ...