首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制转换和强制转换的区别是什么?

强制转换和强制转换的区别是什么?
EN

Stack Overflow用户
提问于 2012-01-14 05:55:31
回答 7查看 48.7K关注 0票数 91

我已经看到这两个术语在各种在线解释中几乎可以互换使用,我查阅过的大多数教科书也不完全清楚其中的区别。

有没有一种清晰而简单的方法来解释你们所知道的差异?

类型转换(有时也称为类型转换)

在需要另一种类型的上下文中使用一种类型的值。

非转换类型转换(有时称为类型双关语)

一种不改变底层比特的变化。

强制

当周围的上下文需要一种类型的值时,编译器自动将该类型的值转换为另一种类型的值的过程。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-14 05:58:40

Type Conversion

单词conversion指的是隐式或显式地将值从一种数据类型更改为另一种数据类型,例如,将16位整数更改为32位整数。

单词用于表示隐式转换。

单词cast通常指的是显式类型转换(而不是隐式转换),而不管这是位模式的重新解释还是实数转换。

因此,强制是隐式的,强制转换是显式的,而转换是其中的任意一种。

以下是一些示例(来自same source):

强制(隐式):

代码语言:javascript
复制
double  d;
int     i;
if (d > i)      d = i;

转换(显式):

代码语言:javascript
复制
double da = 3.3;
double db = 3.3;
double dc = 3.4;
int result = (int)da + (int)db + (int)dc; //result == 9
票数 121
EN

Stack Overflow用户

发布于 2012-01-14 06:29:59

正如您所注意到的,用法各不相同。

我个人的用法是:

  • " cast“是cast运算符的用法。强制转换运算符指示编译器(1)此表达式不是给定类型的,但我向您保证,在运行时该值将是该类型;编译器将把表达式视为给定类型,如果不是,则运行时将产生错误;或者(2)表达式是完全不同的类型,但有一种众所周知的方法可以将表达式的类型实例与强制转换类型的实例相关联。编译器被指示生成执行转换的代码。细心的读者会注意到这些是相反的,我认为这是一个巧妙的技巧。
  • “转换”是一种操作,通过该操作,一种类型的值被视为另一种类型的值--通常是不同的类型,尽管从技术上讲,“标识转换”仍然是一种转换。转换可能是“表示改变”,比如int到double,也可能是“表示保留”,就像string到object一样。转换可以是“隐式”转换,它不需要强制转换,也可以是“显式”转换,它确实需要转换。
  • “强制”是一种更改表示形式的隐式转换。
票数 24
EN

Stack Overflow用户

发布于 2012-01-14 05:57:25

强制转换是将一个对象类型视为另一个类型的过程,强制是将一个对象转换为另一个对象。

请注意,在前面的过程中没有涉及转换,您希望将一个类型视为另一个类型,例如,您有三个不同的对象继承自一个基类型,并且您有一个方法将接受该基类型,在任何时候,如果您知道特定的子类型,您可以将其强制转换为它是什么,并使用该对象的所有特定方法和属性,这将不会创建该对象的新实例。

另一方面,强制意味着在内存中创建新类型的新对象,然后将原始类型复制到新类型,将两个对象都留在内存中(直到垃圾收集器取走其中一个或两者)。

作为示例,请考虑以下代码:

代码语言:javascript
复制
class baseClass {}
class childClass : baseClass {}
class otherClass {}

public void doSomethingWithBase(baseClass item) {}

public void mainMethod()
{
    var obj1 = new baseClass();
    var obj2 = new childClass();
    var obj3 = new otherClass();

    doSomethingWithBase(obj1); //not a problem, obj1 is already of type baseClass
    doSomethingWithBase(obj2); //not a problem, obj2 is implicitly casted to baseClass
    doSomethingWithBase(obj3); //won't compile without additional code
}

由于baseClass

  • obj2已被隐式强制转换为基本类型,因此传递
  • obj1时不会进行任何强制转换或强制转换(转换),这意味着没有创建新对象因为obj2可能已经是基本类型。如果需要以某种方式将otherClass转换为基本类型,您需要提供自己的方法来从baseClass转换为baseClass,这将涉及创建类型为baseClass的新对象,并通过从obj3复制数据来填充该对象。

一个很好的例子是Convert C# class,它提供了在不同类型之间进行转换的自定义代码。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8857763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档