28

これは機能します:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

しかし、これはコンパイラ エラー (「割り当てられていないローカル変数 'a' の使用」) を与えます。

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

私が知る限り、これが発生するのは、最初の例では、技術的には、コンパイラが「a」が割り当てられていないことを認識していないためです。後者の例では、'a' はローカルで定義されているため、簡単に追跡できます。

しかし、後者の例が機能しないのはなぜでしょうか?

整数のデフォルトは 0 ではありませんか? これは、コンパイラが「ベストプラクティス」のために強制するものですか? それとも別の理由がありますか?

4

5 に答える 5

42

最初の例では、フィールドです。フィールドは自動的に 0/false/null にデフォルト設定されます。2 番目の例では、変数です。変数はデフォルト設定されていないため、使用する前に「明確な代入」が必要です。

基本的に、オブジェクトを作成する (または構造体を初期化する) と、メモリがゼロになります (または、デフォルト以外の構造体 ctor の場合は、手動ですべてを初期化する必要があります)。ただし、変数は (すべてのメソッドで) 非常に一般的であるため、常にスタックをゼロにしなければならないというオーバーヘッドは望ましくありません。代わりに、初期値を指定する必要があります。

于 2009-09-14T19:32:53.587 に答える
12

整数のデフォルトは 0 ではありませんか?

クラスのデータ メンバーの場合はそうしますが、ローカル変数の場合はそうではありません。ローカル変数は、使用する前に明示的に初期化する必要があるため、コンパイラ エラーが発生します。

于 2009-09-14T19:31:42.120 に答える
2

クラスの新しいインスタンスをインスタンス化するとき、オブジェクトが必要とするすべてのメモリは「ゼロ化」されます。int は 0 に設定されます。文字列は null に設定されます。これは、C で可能だった多くの奇妙なメモリ バグやハックを回避するためです。 (++)。残念ながら、これには小さな処理コストもあります。そのため、ローカル変数を作成すると、言語はすぐに自分で値を設定すると想定し、必要な命令の総数を減らすために値をゼロにする必要はありません。設定されていないメモリを使用するリスクを相殺するために、変数を使用できるようにする前に、値が設定されていることを確認するコンパイラ チェックが導入されます。

于 2009-09-14T19:34:13.317 に答える
2

これは、クラス レベルで宣言された変数に同じスコープで値を割り当てることができないためである可能性があります (宣言時以外)。

例えば

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

一方

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}
于 2009-09-14T19:34:57.850 に答える