web-dev-qa-db-ja.com

暗黙的な変換と明示的な変換の違い

可能性のある複製:
暗黙のVS明示的な変換

「暗黙の変換」と「明示的な変換」の違いは何ですか? JavaとC++では違いはありますか?

10
saplingPro

明示的な変換では、いくつかの構文を使用してtellプログラムに変換を行います。例(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++仕様が矛盾した意味で使用することは想像できません。)

22
Stephen C

あなたは鋳造を意味しますか?暗黙的には、タイプAをAとして継承するタイプBのインスタンスを渡すことを意味します。

例えば:

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.
}
3
Ben

キャストは明示的な型変換であり、コードで指定されており、コンパイル時にほとんど規則が適用されません。キャストは危険な場合があります。実行時に失敗したり、情報が失われたりする可能性があります。
暗黙的な変換は、データプロモーションルールに準拠するため、またはメソッドのシグネチャを照合するためにコンパイラーによって実行されるタイプ変換またはプリミティブデータ変換です。 Javaでは、安全な暗黙の変換のみが実行されます:アップキャストとプロモーション。\

また、C++の暗黙のカバーについて読むことをお勧めします: http://blogs.msdn.com/b/oldnewthing/archive/2006/05/24/605974.aspx

0
Baz1nga