私は C++ から来て、Java を少し知っていますが、Java について完全に理解していないことが 1 つあります。それはキャストです。C++ では、通常のキャストと static_cast と dynamic_castがあります。Java では、プリミティブ型とオブジェクト型の間のキャスト (ボックス化とアンボックス化として知られています)、プリミティブ型の間のキャスト、Class
関数を使用したキャスト、そして時には未チェックのキャストを実行します。Java のキャスト システムから C++ のキャスト システムへの直接マッピングはありますか? それらは同等ですか?または、片側にユニークなものはありますか?
2 に答える
C++ の知識があれば、Java オブジェクト モデルはかなり簡単に説明できます。クラス型の Java 変数は、対応する型の動的に作成されたオブジェクトへの参照です。初期化された Java 変数T x = new T();
は、C++ ポインターに密接に対応します。T * px = new T;
Java では、すべてのクラス型がポリモーフィック型から継承Object
されるため、すべてのポインタを RTTI に使用できます。Java クラス型変数のすべてのキャストdynamic_cast
は、C++ のものです。したがって、Javaは C++ に(S) x
対応しdynamic_cast<S *>(px)
、null の結果が動的な型が関連していないことを示すのと同じ失敗モードを備えています。
他のすべての C++ ポインター キャストは安全ではなく、Java には同等のものはありません。Java に整数から浮動小数点へのようなスカラー変換があるかどうかはわかりません。もしそうなら、それらは C++ 変換に密接に対応します。
ボクシングとプリミティブ型は、かなり別の無関係な問題です。C++ でそのようなものが必要な場合は、何らかのtemplate <typename T> struct Box
変換T
演算子を使用する必要があります。