C ++クラス定義では、クラス内で独自のクラスのオブジェクトを定義することはできませんが、独自のクラスのポインターオブジェクトと参照を定義することはできます。
class A
{
public:
A ()
{
cout<<"Constructor method."<<endl;
};
A a;
};
void main()
{
A aa;
}
上記のコードコンパイルはエラーを促します
'a':定義中の 'A'を使用します。
a
アチーブメント*a
を変更できる場合。
また、Javaは、クラス内で独自のクラスのオブジェクトを定義できます。
class A{
public A aa;
}
このようなコードはスムーズにコンパイルできますが、定義時にオブジェクトインスタンスを作成すると、コンパイルにも失敗します。
class A{
public A aa = new A();
}
プロンプトエラー:
test1 $ abc。(test1.java:4)でのスレッド "main" java.lang.StackOverflowErrorの例外
明らかに、スタックはオーバーフローしました。
どうして?実際、上記の問題の本質は同じです。つまり、オブジェクトインスタンスを作成するタイミングです。
C ++では、オブジェクトのインスタンスは、オブジェクトが定義されたときに作成されます。つまり、オブジェクトのメモリスペースが割り当てられます。したがって、独自のクラスのオブジェクトを定義するときに定義すると、オブジェクトを再帰的に作成し、オブジェクトaaを作成するという現象が発生します。これは、aaがクラスAのインスタンスであるため、aaにaaオブジェクトがあり、 1つを作成する必要がありますaaオブジェクト、それにメモリを割り当てます...、これによりオブジェクトが再帰的に作成され、その結果、メモリが使い果たされます。
Javaでは、新しいメソッドを呼び出すことによってのみ、オブジェクトのインスタンスを作成でき、オブジェクト用のスペースがメモリに割り当てられます。オブジェクトは、新しい場合にのみオブジェクトインスタンスを作成できるため、独自のクラスのオブジェクトをクラスで定義できます。上記の例を変更してクラスのインスタンスを作成しても、問題はありません。
class A{
public B bb = new B();
}
このようなコードはコンパイルして実行できます。
ただし、newを使用してJavaクラスに独自のオブジェクトを作成する場合は、静的として宣言することができます。これは、クラスのオブジェクトが作成されたとき、またはクラスの静的メンバー(メソッド)が呼び出されたときに静的メンバーが一度だけ初期化され、その後は作成および初期化されないためです。