12

重複の可能性:
クラスはどのようにして独自のタイプのメンバーを持つことができますか?この無限の再帰ではありませんか?

コード:

public class Test2{
    private Test2 subject = new Test2(); //Create Test2 object in Test2
    private int num;
}

質問:

  1. なぜJavaは上記のコードの実行を許可しますが、C ++は許可しませんか?

  2. 上記のコードは無限の数のオブジェクトを作成しますか?それTest2自体がオブジェクトを含んでいるので、それ自体がオブジェクトを持っているオブジェクトなどTest2が再び含まれています。Test2Test2

4

6 に答える 6

18

問題に関する2つの言語の主な違いは、Javaは参照セマンティクス(プリミティブ型を除く)を備えた言語であり、C++は参照とポインターを介して参照セマンティクスを許可する値セマンティクスを備えた言語であるということです。

両方の言語で類似しているように見える構文は、完全に異なる意味を持ちます。Javaで参照Test2 x = new Test2();)を作成する場合、C ++での同等の構造はポインター(Test2 *x = new Test2();)を使用します。

主な違いは、ポインターを使用して値セマンティクスの上に参照セマンティクスを提供するのは簡単ですが、(純粋な)参照セマンティクスの上に値セマンティクスを提供することは不可能であるということです。このステートメントの意味の一部には、メモリ内のJava内のオブジェクトのレイアウトやデータの場所(プリミティブ型とプリミティブ型の配列以外の場合)を制御できないことが含まれますが、反対方向では、オブジェクトをより細かく制御できます。 C ++では、Javaオブジェクトを模倣できます。

于 2012-11-28T15:08:28.667 に答える
14

質問2-このコードを実行すると、StackOverflowException =>はい、無限の数のオブジェクトが作成されます(試行します...)

public class Test2 {

    private Test2 subject = new Test2(); //Create Test2 object in Test2

    public static void main(String[] args) throws Exception {
        Test2 t = new Test2();
    }
}
于 2012-11-28T14:48:06.003 に答える
4

subjectこれはのインスタンスへの参照Test2です。それを実行しようとすると、コードはすぐにいくつかのリソース(おそらくスタックスペース、おそらくヒープスペース)を使い果たします。

于 2012-11-28T14:47:01.617 に答える
3

Javaが上記のコードの実行を許可しているのにC++が許可していないのはなぜですか?

2011年以降、C ++では、クラスメンバーを宣言で初期化することもできます。

ただし、この場合は許可されません。インスタンス化できるのは完全な型のみであり、クラス型はクラス定義内で不完全であるため、コンストラクターで初期化するか、関数を呼び出す必要があります。

class Test;
Test * make_test();

class Test {
    // Test is incomplete, so "new Test" is not possible here
    Test * test = make_test();
};

// Test is complete, so we can instantiate it here
Test * make_test() {return new Test;}

Javaには不完全な型の概念がないため、クラスのインスタンス化が許可されている場所であればどこでもクラスをインスタンス化できます。

上記のコードは無限のオブジェクトを作成しますか?

はい、そのようなクラスをインスタンス化しようとすると、プログラムが再帰的な死のスパイラルに陥ります。

于 2012-11-28T14:57:40.537 に答える
0

であると宣言するsubjectstatic、シングルトンパターンの熱心な初期化バージョンが得られます。これにより、リソースが不足することはありません。

于 2012-11-28T14:49:12.210 に答える
0

複数のコンストラクターを持つことができるので、許可されています。コンストラクターが1つしかない場合、これは実際に無限ループになります。

public class Test{
    private Test a;

    public Test(String s){
        this.a=new Test();
    }

    public Test(){

    }

}
于 2012-11-28T14:49:24.740 に答える