栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么要避免铸造?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么要避免铸造?

您已经用三种语言标记了这三种语言,答案在三种语言之间确实有很大的不同。对C ++的讨论或多或少也意味着对C转换的讨论,这(或多或少)给出了第四个答案。

由于这是您没有明确提及的内容,因此我将从C开始。C强制转换存在许多问题。一个是他们可以做很多不同的事情。在某些情况下,强制转换只不过告诉编译器:“闭嘴,我知道我在做什么”,即,即使在进行可能导致问题的转换时,它也可以确保编译器不会警告您这些潜在的问题。仅举例来说

chara=(char)123456;
。定义此实现的确切结果(取决于的大小和签名)
char
),并且除非在非常奇怪的情况下使用,否则可能没有用。C强制转换也有所不同,它们是仅在编译时发生的事情(即,您只是告诉编译器如何解释/处理某些数据)还是在运行时发生的事情(例如,从double到的实际转换)长)。

C
++试图通过添加一些“新的”强制转换运算符至少在某种程度上解决该问题,每个运算符仅限于C强制转换功能的一部分。这使得(例如)意外地进行您确实不想要的转换变得更加困难-
如果您 打算在对象上放弃constness,则可以使用

const_cast
,并确保它 唯一
会影响的是一个目的是
const
volatile
或不是。相反,
static_cast
不允许a
影响对象是否为
const
或。
volatile
。简而言之,您具有大多数相同类型的功能,但是将它们归类,因此一个类型转换通常只能执行一种转换,而单个C样式类型转换可以在一个操作中进行两次或三个转换。主要的例外是在至少某些情况下,您
可以 用a
dynamic_cast
代替a
static_cast
,尽管写成a
dynamic_cast
,但最终还是用a
static_cast
。例如,您可以使用它
dynamic_cast
来遍历一个类层次结构,但是强制“向上”转换层次结构始终是安全的,因此可以静态完成,而强制“向下”转换层次结构不一定是安全的,因此动态完成。


Java和C#彼此更为相似。尤其是,两者都(实际上是?)强制转换始终是运行时操作。就C
++转换运算符而言,就

dynamic_cast
实际完成而言,它通常最接近-即,当您尝试将对象转换为某种目标类型时,编译器会插入运行时检查以查看是否允许该转换,如果不是,则抛出异常。确切的细节(例如,用于“错误的强制转换”异常的名称)有所不同,但是基本原理仍然基本相似(尽管如果有内存服务,Java的确会将强制转换应用于少数非对象类型,例如
int
更接近C的类型)。强制转换-
但是很少使用这些类型,以至于1)我不确定这一点,以及2)即使是真的,也没关系。

从更一般的角度来看,情况非常简单(至少是IMO):强制转换(显然足够)意味着您正在将某种东西从一种类型转换为另一种类型。当/如果您这样做,则会引发“为什么?”的问题。如果您确实希望某种东西是特定类型,为什么不将其定义为开头的那个类型呢?这并不是说
没有
理由进行这样的转换,但是在任何时候,它都会提示您是否可以重新设计代码,以便在整个过程中使用正确的类型。甚至看似无害的转换(例如,在整数和浮点之间)也应比通常更仔细地检查。尽管他们
看起来
相似,整数应真正用于“计数”类型的事物,而浮点数应用于“已度量”类型的事物。无视这种区别是导致一些疯狂言论的原因,例如“美国家庭平均有1.8个孩子”。即使我们都能看到这种情况,但事实是
没有一个 家庭有1.8个孩子。他们可能有1个,或者可能是2个,或者可能更多,但从来没有1.8个。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/486207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号