回答:
理論的には、2つの概念は大きく異なります。
型キャストとは、あるタイプ(大まかに言えば、オブジェクト構造)を別のタイプに交換することを指し、タイプ変換とは、値(大まかに言えば、オブジェクトのコンテンツ)を変換することを指します。これにより、新しいタイプに属するものとして解釈されます。理論的には、それらが混合することはありません。
とは言っても、実際には、別のものなしで1つを持つことができますが、ほとんどの場合、それは悪い考えです。オブジェクトの内容を変更せずに、オブジェクトの構造の認識を変更することはほとんど意味がありません。実際には、ほとんど同じです
AbstractSprite
それが実際にあることをまったく知らない間、参照を保持していますBigGreenTreeSprite
か?
言語によって、「キャスト」と「変換」という言葉の定義は異なります。この質問は、特定の言語を参照すること以外には意味がないと思います。
たとえば、Cでは、「キャスト」という用語は、変換される式の前の括弧内の型名で構成される明示的なキャスト演算子のみを適切に指します。「変換」は、あるタイプの値を別のタイプの値に変換します。一部の変換は、表現を構成するビットを再解釈することによって実装されますが、値から値への変換として定義されています。(はい、それはポインター変換でも同じです。異なるポインター型が異なる表現を持つことは可能です。)
Cには「暗黙のキャスト」などはありません。
一部の変換は明示的であり、キャスト演算子によって指定されます。その他は暗黙的であり、あるタイプの式が別のタイプの式を必要とするコンテキストで使用される場合に、特定のケースに適用されます。実行される変換は、どちらの場合でもまったく同じです。
例えば:
double x = 1.23;
int y = (int)x; /* A cast, or explicit conversion, setting y to 1 */
int z = x; /* An implicit conversion, setting z to 1. */
C ++も同様です。それはCと同じキャストと変換を持っており、それはCスタイルのキャスト式に関数表記相当を追加し、プラス4つのより具体的なキーワード:const_cast
、dynamic_cast
、reinterpret_cast
、とstatic_cast
。
(int)1.5-2*(int)(-1.5)
、収率3、4、5、または6を、しかし場合(int)
に交換されていたtruncInt
、roundPeriodicInt
、floorInt
、またはroundEvenInt
...、
Round
か、Trunc
-IMHOをはるかにクリーンなデザインにします。
キャスト中、あるクラスのインスタンスを別のクラスのインスタンスであるかのように読み取ります。このクラスのペアに適用できるかどうかは不明です。チェック以外のランタイム作業はありません。多くの場合、コンパイル段階で非互換性が発生する可能性があります。
変換中に、あるクラスのインスタンスのフィールドを別のクラスのインスタンスに再結合または再カウントします。そのための関数がある場合、それはこのまさにそのインスタンスに適用可能かそうでないかです。すべての作業は実行時に行われます。コンパイル中にエラーをチェックできませんでした。