none
コンストラクタとフィールド RRS feed

  • 質問

  • お世話になっております。

     

    classのコンストラクタについてですが、疑問があります。

     

    Microsoft Press VC#2005の書籍で、

     

    「初期化されないフィールドについては、既定で0またはNULLで初期化される(P60)」と記述されており、

    「コンストラクタのないクラスには、既定でパラメータのないコンストラクタが用意されており、フィールドに既定値を割り当てる(P72)」と記述しております。

    そして既定のコンストラクタは、「カスタムのコンストラクタを追加すると削除される」と記述しております。

     

    それを踏まえ、

     

    class CAbc

    {

    // 既定のコンストラクタを削除

    public CAbc(int n )

    {

    }

     

    public int m_a;

    }

     

    このクラスのインスタンスを生成した場合、「int m_a」は、不安定な変数(つまり初期化されていない変数)となるのでしょうか。

    しかし、この変数は初期化されています。

     

    class CDef

    {

    public void FuncA(int n){}

    }

     

    //Main関数

    static void Main()

    {

    CAbc a = new CAbc(0);

    CDef d = new CDef();

     

    d.FuncA(m_a);// コンパイルエラーはでない

     

    int r;

    d.FuncA(r);//初期化されていないとコンパイルエラーとなる

    }

     

    既定のコンストラクタが、フィールドに既定値を割りあてるとは、いったい何を意味するのでしょうか。

     

    結論、フィールドは宣言するだけで、既定値が設定され初期化されていると考えてよろしいのでしょうか。

     

     

     

     

     

     

     

     

     

     

     

    2008年6月30日 6:38

回答

  • >結論、フィールドは宣言するだけで、既定値が設定され初期化されていると考えてよろしいのでしょうか。


    そういう認識で良いと思います。

     

    >「コンストラクタのないクラスには、既定でパラメータのないコンストラクタが用意されており、フィールドに既定値を割り当てる」


    は、既定コンストラクタ「だけ」がフィールドに既定値を割り当てるわけではない、という解釈の方が良いかと。

     

    2008年6月30日 7:41

すべての返信

  • >結論、フィールドは宣言するだけで、既定値が設定され初期化されていると考えてよろしいのでしょうか。


    そういう認識で良いと思います。

     

    >「コンストラクタのないクラスには、既定でパラメータのないコンストラクタが用意されており、フィールドに既定値を割り当てる」


    は、既定コンストラクタ「だけ」がフィールドに既定値を割り当てるわけではない、という解釈の方が良いかと。

     

    2008年6月30日 7:41
  • ご返事ありがとうございます。

     

     

    フィールドが宣言するだけで(ほんとはインスタンが生成されたときなんでしょうが)、

    既定値(0 or null)で初期化されないと、

    たとえば、コンストラクタで、(なにも代入なしで)i++;をしても

    コンパイラは、「未割り当ての変数」として警告していないですもんね。

     

     

     

     

    2008年7月3日 4:23
  • C# 言語仕様 Version 1.2 に、以下のように書かれています。

     

    ----- 引用開始 -------------------------

     

    以下のカテゴリの変数は、自動的に既定値に初期化されます。
    • 静的変数
    • クラス インスタンスのインスタンス変数
    • 配列要素
    変数の既定値は、変数の型に依存し、次のようにして決定されます。
    • value-type の変数の場合、既定値は、value-type の既定のコンストラクタ (4.1.2 を参照) によって計算された値と同じです。
    • reference-type の変数の場合、既定値は null です。

    ----- 引用終了 -------------------------

     

    C# 言語仕様は公開されています。以下を参考にして下さい。
    http://msdn.microsoft.com/ja-jp/library/ms228593.aspx

    2008年7月3日 9:17
    モデレータ
  • ご返事ありがとうございます。

     

    引用されている個所はすべりそのままで、ありがたいのですが、

    上記の資料を探しているのですが、見つかりません。

     

    どこにあるのでしょうか?

     

     

     

     

    2008年7月4日 5:27
  • 通常は以下にあります。

     

    C:\Program Files\Microsoft Visual Studio 8\VC#\Specifications\1041

     

    ネットだと

     

    5.2 既定値
    http://msdn.microsoft.com/ja-jp/library/aa691171(VS.71).aspx

     

    #以前はC#言語仕様書がダウンロードできたと思うんですが、私も探せません・・・

    2008年7月4日 6:38
    モデレータ