10

可能重复:
隐式 VS 显式转换

“隐式转换”和“显式转换”有什么区别?Java 和 C++ 的区别是什么?

4

3 回答 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++ 规范以矛盾的方式使用它们。)

于 2011-09-25T07:39:22.953 回答
3

你是说铸造?隐式意味着你传递一个类型的实例,比如 B,它继承自一个类型,比如 A 作为 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.
}
于 2011-09-25T07:38:01.693 回答
0

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

我还建议阅读有关 C++ 隐式覆盖的内容:http: //blogs.msdn.com/b/oldnewthing/archive/2006/05/24/605974.aspx

于 2011-09-25T07:40:49.357 回答