-3

Javaでは次のようなコードを書くことができます

public class Print{
int n=10;
String path="C:\\file.txt";
}

これらのデータ メンバーのメモリは、オブジェクトの作成前にどこに割り当てられますか?? そして、C++ では同じことはできないと思います!! C++ と Java について説明してください ...

4

3 に答える 3

3

Java には Class という名前のクラスがあり、ランタイムにロードされたクラスごとに 1 つの Class オブジェクトがあります。これらの Class オブジェクトには、初期化に必要な 10 や "C:\file.txt" などのデータが含まれています。

C++11 でも同じことができます (少なくとも C++ 風の方法で同じように見え、同じセマンティクスを持っています)。

class Print
{
  int n = 10;
  std::string path = "C:\\file.txt";
};

C++03 ではそれは不可能であり、すべてのコンストラクターでメンバーを初期化する必要があります。C++11 での実装方法は Java とは異なります。Java とは異なり、C++ には Class オブジェクトがなく、実行時にクラスがロードされません。C++11 では、この種のメンバー初期化子は、すべてのコンストラクターで手動で初期化子を記述したかのように、コンパイラによって処理されます。コンパイルされたプログラム コードのどこかに 10 と "C:\file.txt" があり、各コンストラクターのコードには、構築されるオブジェクトの 2 つのメンバーがそれらの値で初期化されるセクションが含まれています。つまり、コンストラクターで一方または両方のメンバーを明示的に初期化しない限り、デフォルトの初期化子がオーバーライドされるためです。

于 2013-02-04T08:11:55.070 に答える
0

Java では、キーワード「new」が使用されるまで、または文字列がそれに値を割り当てるまで、メモリはオブジェクトに割り当てられません。

于 2013-02-04T08:02:48.647 に答える
0

Java でも C++ でも、変数nにアクセスすることはできず、 typeのオブジェクトpathを作成する前に。どの種類のメモリでオブジェクトが作成されるか、同じ種類のメモリですべてのフィールドが作成されます。Print

C++ では、このようなオブジェクトを作成すると

void foo() {
    Print obj;
}

スタックに作成されます。そして、このようなオブジェクトを作成すると

void foo() {
    Print * obj = new Print;
}

ヒープに作成されます。

Java では、ヒープ割り当てオブジェクトのみを作成できるため、オブジェクト自体とそのフィールドの両方がヒープに配置されます。

宣言でのクラスのフィールドの初期化は、C++03 ではなく C++11 でのみ許可されることに注意してください。

于 2013-02-04T08:05:45.900 に答える