隐式转换和显式转换的区别

10
可能有重复:
隐式转换与显式转换的区别 在编程中,“implicit conversion”指的是自动将一种数据类型转换为另一种数据类型,而“explicit conversion”则需要通过代码明确地指定应该进行的数据类型转换。Java和C++之间的区别不同,但概念相似。

这只是部分重复。这个问答是关于Java和C++,以及涉及转换的隐式和显式含义。链接的问答仅涉及C++中的隐式和显式转换。 - Stephen C
3个回答

22

显式转换是指你使用某些语法来告诉程序进行一个转换。例如(在Java中):

int i = 999999999;
byte b = (byte) i;  // The type cast causes an explicit conversion
b = i;              // Compilation error!!  No implicit conversion here.

隐式转换是指在没有语法的情况下发生的转换。例如(在Java中):

int i = 999999999;
float f = i;    // An implicit conversion is performed here

需要注意的是,在 Java 中,涉及到基本类型的转换通常涉及一些表示上的变化,这可能导致精度或信息的损失。相比之下,涉及引用类型的转换则不会改变基本表示。


Java 和 C++ 中的差异是否不同?

我想不会吧。显然,可用的转换将不同,但“隐式”和“显式”的区别将是相同的。(注意:我不是 C++ 语言专家...但这些词在英语中有一个自然的意义,我无法想象 C++ 规范以相反的意义使用它们。)


3
您是指类型转换吗?隐式类型转换指您将一个从某个类型(例如B)继承而来的实例传递给它所继承的类型(例如A),并将其视为该类型的实例。
例如:
Class A;
Class B extends A;

function f(A a) {...};

main() {
  B b = new B;
  f(b); // <-- b will be implicitly upcast to A.
}

实际上还有其他类型的隐式转换 - 在原始数据类型之间使用默认构造函数进行转换。您需要更具体地提出问题。
使用默认构造函数进行隐式转换:
class A { 
  A (B b) { ... };
}

class B {};

main() {
  B b = new B();
  A a = b; // Implict conversion using the default constructor of A, C++ only.
}

0

强制类型转换是一种显式的类型转换,在代码中指定,并且在编译时受到非常少的规则限制。强制类型转换可能不安全;它们可能在运行时失败或丢失信息。
隐式转换是编译器执行的类型转换或原始数据转换,以遵守数据提升规则或匹配方法签名。在Java中,只执行安全的隐式转换:向上转型和提升。

此外,我建议阅读有关C++隐式转换的内容:http://blogs.msdn.com/b/oldnewthing/archive/2006/05/24/605974.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接