Javaでは次のようなコードを書くことができます
public class Print{
int n=10;
String path="C:\\file.txt";
}
これらのデータ メンバーのメモリは、オブジェクトの作成前にどこに割り当てられますか?? そして、C++ では同じことはできないと思います!! C++ と Java について説明してください ...
Javaでは次のようなコードを書くことができます
public class Print{
int n=10;
String path="C:\\file.txt";
}
これらのデータ メンバーのメモリは、オブジェクトの作成前にどこに割り当てられますか?? そして、C++ では同じことはできないと思います!! C++ と Java について説明してください ...
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 つのメンバーがそれらの値で初期化されるセクションが含まれています。つまり、コンストラクターで一方または両方のメンバーを明示的に初期化しない限り、デフォルトの初期化子がオーバーライドされるためです。
Java では、キーワード「new」が使用されるまで、または文字列がそれに値を割り当てるまで、メモリはオブジェクトに割り当てられません。
Java でも C++ でも、変数n
にアクセスすることはできず、 typeのオブジェクトpath
を作成する前に。どの種類のメモリでオブジェクトが作成されるか、同じ種類のメモリですべてのフィールドが作成されます。Print
C++ では、このようなオブジェクトを作成すると
void foo() {
Print obj;
}
スタックに作成されます。そして、このようなオブジェクトを作成すると
void foo() {
Print * obj = new Print;
}
ヒープに作成されます。
Java では、ヒープ割り当てオブジェクトのみを作成できるため、オブジェクト自体とそのフィールドの両方がヒープに配置されます。
宣言でのクラスのフィールドの初期化は、C++03 ではなく C++11 でのみ許可されることに注意してください。