c语言static int x,为什么要使用static_cast int (x)而不是(int)x?
我听说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?相关推荐
- C语言static 具体分析
google在最后三页C语言static内容,可找到的资料非常少.无论是长篇大论不知所云的话,在关键位置或跳过,习的人来说參考性不是非常大.所以.我这篇博文博採众家之长,把互联网上的资料整合归类,并亲 ...
- C语言 static - C语言零基础入门教程
目录 一.static 简介 二.static 修饰变量 1.static 局部静态变量 2.static 全局静态变量 三.static 修饰函数 四.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
- c语言static知识点,C语言知识点集锦
C语言知识点集锦 C语言作为一门非常适合编程入门的语言,打好基础的重要性不言而喻.下面整理了一些C语言知识点,希望对大家有所帮助! 知识点1:指针使用注意 Int *p只能指向int类型的数据 指针变 ...
- [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...
- C语言 static变量和函数详解
概述 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护. 但是对于c语言初学者,static由于使用灵活,并不容易掌握.本文就static在c语言中的应用进 ...
- c语言static关键字参数
static 关键字. 1.static修饰局部变量: ① 整个生命周期延长, ② 静态局部变量只会被初始化一次,以后每一次调用静态局部变量,就会使用上一次调用完保存的值. ③ 只能被作用域的变量和函 ...
- c语言staticint的作用,C语言 static 声明静态变量?大佬原来用它干这事!
原标题:C语言 static 声明静态变量?大佬原来用它干这事! C语言可变参数只会用算啥本事?看我来抽丝剥茧干翻它! 高手在写代码的时候,会特别注重的一点就是,对外的方法对外,不对外的方法和数据,都 ...
- C语言static关键字修饰变量及函数时的用法和原理
目录 一.static关键字修饰局部变量 二.static关键字修饰全局变量 三.static关键字修饰函数 一.static关键字修饰局部变量 在内存中,往往将其分为三个区块,栈区,堆区,静态区.C ...
- C语言static和const的区别
C语言static和const的区别 static: 1.不考虑类,static的作用: 1)第一个作用:隐藏.使得全局变量和函数对其它文件不可见,同时避免了不同文件的命名冲突. 2) ...
- C语言 static静态变量的作用
C语言 static静态变量的作用 static c语言的变量种类 静态变量通过关键字 static 进行声明,该变量存储在数据段上,也就是内存上,可以改变变量的作用域和生命周期. 对于局部变量作用域 ...
最新文章
- 上海人工智能再出重磅!寒武纪科技发布新一代云端AI芯片,联想、曙光、科大讯飞发布相关应用...
- MKTickerView
- fastdfs php client,centos 5.7_64位下FastDFS_client的配置和PHP测试
- android studio gradle 打出jar,同时将依赖的第三方jar打包在一起
- 贪心应用--汽车加油次数问题
- 数据库查询求小于_SQL学习笔记(二)简单查询
- 基于Linux和MiniGUI的嵌入式系统软件开发指南(七)
- java控制台进度_java进度条:控制台输出百分比示例代码
- 软件测试计划和测试方案区别
- 车间能量看板设计需求,能给个思路吗
- 4.人工智能时代下的大数据
- 计算机ps二级考试试题,2020年3月计算机等级Photoshop考试模拟试题及答案
- android framework学习回忆
- Java IO NIO NIO2
- 【电源】【PCB】电源板(提供±2v5,3v3,5v,12v供电)的制作——电赛使用
- 2003系统dhcp服务器默认租期,Windows 2000和Windows Server 2003下DHCP服务器的租约和授权...
- 把xml数据集 转为 BDD100K 的json数据格式
- python——百钱百鸡题
- 如何测试Tomcat是否启动成功
- CRO的作用,现状,发展和名录
热门文章
- 从生态、标准、应用看中国开源 30 年!
- 您的包裹“ MySQL灵魂十连” 待签收
- COSCon'20 Apache Roadshow- China 精彩收官 | 数据篇
- 13 岁不可能创建出 RISC-V 内核?Nicholas Sharkey:我可以
- 告别求职难!一汽-大众专场直播招聘来了
- 将 Kubernetes 云原生技术革命进行到底!
- 滴滴自动驾驶首轮融资超5亿美元 加大研发投入 助力“新基建”
- 看似毫不相干,哲学与机器学习竟有如此大的交集?
- Spring 框架之 AOP 原理深度剖析!|CSDN 博文精选
- 5G + 云网融合,加速万物互联