-2

私は何年も前から Java を使用しています。ここで、C++ プログラムの一部を理解する必要があります。

TimeStamp theTimeStamp;
theTimeStamp.update();

私を困惑させているのは、なぜ私たちが書かないのかということです

TimeStamp theTimeStamp = new(); 

私の直感では、オブジェクトを使用するには、最初にメモリ空間を割り当ててオブジェクトに関連付ける必要があります。

これは、Java と C++ が根本的に異なる点ではないでしょうか。明確にしていただけますか?

[EDIED] 「TimeStamp theTimeStamp = malloc();」と書きました。

4

4 に答える 4

3

このように考えてみてください。Javaでは、intが必要な場合は行いません

int i = new int(5);
i++;

あなたがやる

int i = 5;
i++;

Java では、プリミティブとオブジェクトが区別されます。プリミティブは new なしでスタックに割り当てられ、スコープの最後で破棄されます。オブジェクトは new で割り当てられ、ガベージ コレクションされます。

C++ では、作成するすべてのクラスはデフォルトでプリミティブのようになります。スタック上に作成され、スコープの最後で破棄されます。コンストラクタとデストラクタを記述することで、作成時と破棄時に何が起こるかを制御できます。変数がスコープによって制限されている限り、これはうまく機能します。そうでない場合は、new (古いスタイル) または make_unique/make_shared (最新のスタイル) を使用してクラスのオブジェクトをヒープに割り当てることができます。

于 2013-10-30T13:12:43.377 に答える
2

与えられた例では、引数が渡されないため、TimeStamp のコンストラクターが引数なしで呼び出され、スタックに新しい TimeStamp が作成されます。この変数は、スコープがなくなると削除されます (新しいスタック フレームが使用されます)。

mallocパラメータとして渡されたメモリ量を割り当て、そのサイズのブロックに void* を返します。このメモリはヒープに割り当てられ、スコープがなくなっても削除されず、free明示的に d する必要があります。

mallocただし、これは C++ であるため、 andを使用したくない場合はfree、使いやすい C++ バリアントである new および delete に固執する必要があります。

于 2013-10-30T08:42:01.683 に答える
2

自動変数は、プログラム フローが変数のコンテキストに出入りするときに、自動的に割り当ておよび割り当て解除される変数です。

コードのブロック内で宣言されたすべての変数は、デフォルトで自動です。

だから流れが来ると

TimeStamp theTimeStamp;

デフォルトのコンストラクターを使用して、このオブジェクトをスタックに自動的に割り当てます。フローが到達すると、デストラクタも自動的に呼び出されます}

動的メモリを使用して割り当てることもできます。

TimeStamp *theTimeStamp = new TimeStamp(); //calling default constructor

しかもdelete theTimeStamp;手動。

クラス変数 (オブジェクト) の割り当てに malloc または free を使用しないでください。

于 2013-10-30T08:47:58.910 に答える