2
class A
{
    A a;//why can't we do this in C++ but it is allowed in Java?
};

この質問を使用して、C ++で許可されていない理由を知りましたが、Javaで許可されているのはなぜですか? コンパイル中にメモリサイズがわからないという同じ議論によれば、Javaでも許可されるべきではありません。

4

4 に答える 4

5

C++ では、次のことができます。

class A {
    A *a;
}

これは、連結リストを含む多くのデータ構造を実装する方法です。

あなたが述べたように、C++ でこれを行うことはできません:

class A {
    A a;
}

いくつかの理由で C++ でそれを行うことはできません: (あなたが述べたように) のメモリ サイズがわからないためだけでなくA、everyには永久に再帰するA型のメンバーがあることを意味するためです。 A.

したがって、Java では、上記の最初の例と同等のものを使用できます。

class A {
    A a;
}

たまたま、この構文は C++ 構文の 2 番目の例と同じように 見えますが、実際には、最初の C++ の例と同じ意味Aを持っています。 (Java) クラスのオブジェクトへA

2 番目の C++ 構文には、同等の Java 構文がありません。Java では、クラスのすべてのインスタンス (つまり、非プリミティブ) が常に参照であるためです。

于 2012-08-05T12:16:49.147 に答える