我听说static_cast函数应该比C样式或简单的函数样式转换更可取。 这是真的? 为什么?

#1楼

除处理指向类的指针外,static_cast还可以用于执行在类中显式定义的转换,以及在基本类型之间执行标准转换:

double d = 3.14159265;

int i = static_cast(d);

#2楼

static_cast意味着您不能偶然const_cast或reinterpret_cast ,这是一件好事。

#3楼

这是关于您要强加多少类型安全性。

当您编写(bar) foo (如果您未提供类型转换运算符,则相当于reinterpret_cast foo ),您是在告诉编译器忽略类型安全性,并按照提示执行操作。

在编写static_cast foo您要求编译器至少检查类型转换是否有意义,对于整数类型,请插入一些转换代码。

编辑2014-02-26

我在5年前就写了这个答案,但我弄错了。 (请参阅评论。)但是它仍然会被投票!

#4楼

一个实用的技巧:如果您打算整理项目,则可以在源代码中轻松搜索static_cast关键字。

#5楼

主要原因是经典C强制转换在我们称为static_cast<>() , reinterpret_cast<>() , const_cast<>()和dynamic_cast<>()之间没有区别。 这四件事完全不同。

static_cast<>()通常是安全的。 语言存在有效的转换,或者使之成为可能的适当的构造函数。 唯一有风险的是当您降级为继承的类时。 您必须通过语言外部的方式(例如对象中的标记)确保该对象实际上是您声称的对象的后代。 只要检查结果(指针)或考虑到可能的异常(引用), dynamic_cast<>()都是安全的。

另一方面, reinterpret_cast<>() (或const_cast<>() )始终很危险。 您告诉编译器:“相信我:我知道这看起来不像foo (看起来好像是不可变的),但是确实如此。”

第一个问题是,在不查看大量分散代码并知道所有规则的情况下,几乎不可能分辨出将在C样式转换中发生哪一个。

让我们假设这些:

class CDerivedClass : public CMyBase {...};

class CMyOtherStuff {...} ;

CMyBase *pSomething; // filled somewhere

现在,这两种编译方式相同:

CDerivedClass *pMyObject;

pMyObject = static_cast(pSomething); // Safe; as long as we checked

pMyObject = (CDerivedClass*)(pSomething); // Same as static_cast<>

// Safe; as long as we checked

// but harder to read

但是,让我们看一下几乎相同的代码:

CMyOtherStuff *pOther;

pOther = static_cast(pSomething); // Compiler error: Can't convert

pOther = (CMyOtherStuff*)(pSomething); // No compiler error.

// Same as reinterpret_cast<>

// and it's wrong!!!

如您所见,在不了解所有涉及的所有类的情况下,没有简单的方法来区分这两种情况。

第二个问题是C样式转换很难定位。 在复杂的表达式中,很难看到C样式的强制转换。 在没有完整的C ++编译器前端的情况下,几乎不可能编写需要定位C样式转换的自动化工具(例如搜索工具)。 另一方面,很容易搜索“ static_cast

pOther = reinterpret_cast(pSomething);

// No compiler error.

// but the presence of a reinterpret_cast<> is

// like a Siren with Red Flashing Lights in your code.

// The mere typing of it should cause you to feel VERY uncomfortable.

这意味着,不仅C风格的强制转换更加危险,而且要确保它们正确无误地查找它们要困难得多。

c语言static int x,为什么要使用static_cast int (x)而不是(int)x?相关推荐

  1. C语言static 具体分析

    google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲 ...

  2. C语言 static - C语言零基础入门教程

    目录 一.static 简介 二.static 修饰变量 1.static 局部静态变量 2.static 全局静态变量 三.static 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  3. c语言static知识点,C语言知识点集锦

    C语言知识点集锦 C语言作为一门非常适合编程入门的语言,打好基础的重要性不言而喻.下面整理了一些C语言知识点,希望对大家有所帮助! 知识点1:指针使用注意 Int *p只能指向int类型的数据 指针变 ...

  4. [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)

    文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...

  5. C语言 static变量和函数详解

    概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...

  6. c语言static关键字参数

    static 关键字. 1.static修饰局部变量: ① 整个生命周期延长, ② 静态局部变量只会被初始化一次,以后每一次调用静态局部变量,就会使用上一次调用完保存的值. ③ 只能被作用域的变量和函 ...

  7. c语言staticint的作用,C语言 static 声明静态变量?大佬原来用它干这事!

    原标题:C语言 static 声明静态变量?大佬原来用它干这事! C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它! 高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都 ...

  8. C语言static关键字修饰变量及函数时的用法和原理

    目录 一.static关键字修饰局部变量 二.static关键字修饰全局变量 三.static关键字修饰函数 一.static关键字修饰局部变量 在内存中,往往将其分为三个区块,栈区,堆区,静态区.C ...

  9. C语言static和const的区别

    C语言static和const的区别 static: 1.不考虑类,static的作用:     1)第一个作用:隐藏.使得全局变量和函数对其它文件不可见,同时避免了不同文件的命名冲突.     2) ...

  10. C语言 static静态变量的作用

    C语言 static静态变量的作用 static c语言的变量种类 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期. 对于局部变量作用域 ...

最新文章

  1. 上海人工智能再出重磅!寒武纪科技发布新一代云端AI芯片,联想、曙光、科大讯飞发布相关应用...
  2. MKTickerView
  3. fastdfs php client,centos 5.7_64位下FastDFS_client的配置和PHP测试
  4. android studio gradle 打出jar,同时将依赖的第三方jar打包在一起
  5. 贪心应用--汽车加油次数问题
  6. 数据库查询求小于_SQL学习笔记(二)简单查询
  7. 基于Linux和MiniGUI的嵌入式系统软件开发指南(七)
  8. java控制台进度_java进度条:控制台输出百分比示例代码
  9. 软件测试计划和测试方案区别
  10. 车间能量看板设计需求,能给个思路吗
  11. 4.人工智能时代下的大数据
  12. 计算机ps二级考试试题,2020年3月计算机等级Photoshop考试模拟试题及答案
  13. android framework学习回忆
  14. Java IO NIO NIO2
  15. 【电源】【PCB】电源板(提供±2v5,3v3,5v,12v供电)的制作——电赛使用
  16. 2003系统dhcp服务器默认租期,Windows 2000和Windows Server 2003下DHCP服务器的租约和授权...
  17. 把xml数据集 转为 BDD100K 的json数据格式
  18. python——百钱百鸡题
  19. 如何测试Tomcat是否启动成功
  20. CRO的作用,现状,发展和名录

热门文章

  1. 从生态、标准、应用看中国开源 30 年!
  2. 您的包裹“ MySQL灵魂十连” 待签收
  3. COSCon'20 Apache Roadshow- China 精彩收官 | 数据篇
  4. 13 岁不可能创建出 RISC-V 内核?Nicholas Sharkey:我可以
  5. 告别求职难!一汽-大众专场直播招聘来了
  6. 将 Kubernetes 云原生技术革命进行到底!
  7. 滴滴自动驾驶首轮融资超5亿美元 加大研发投入 助力“新基建”
  8. 看似毫不相干,哲学与机器学习竟有如此大的交集?
  9. Spring 框架之 AOP 原理深度剖析!|CSDN 博文精选
  10. 5G + 云网融合,加速万物互联