- ベストアンサー
C# コンストラクタ オーバーロード
今C#を勉強しているのですが、よくコンストラクタがわかりません。初期化をする、というのは理解できるのですが、オーバーロードの際、 int get; string get2; Person(int a ) { get=a; get2="ああ" } Person(int b,string a) { get=b; get2=a } show() { Console.WriteLine("{0}{1}"get,get2); } メインメソッド Person p1 = new Person( 1); Person p2 = new Person(2,"あ"); p1.show(); p2.show(); こうすると出力結果が 1ああ 2あ になるはずですが、(わかりずらいですが、)自分の中ではnew演算子が呼ばれたときにが呼ばれて、変数に値が入ります。そして次のnew演算子でが呼ばれて値が上書きされるので2あ 2あ になると思うのですが。それともp1.show();の時点でもう一回コンストラクタが呼ばれているのでしょうか。要は上書きされるのか、showの時にコンストラクタが呼ばれ、その値で出力されるのか、です。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
p1とp2は、残念ですが別の存在です。 p1がコンストラクタを実行したら、p1のインスタンスにあるそのコンストラクタが実行されて、p1が持っているフィールドが初期化されます。 同様に、p2がコンストラクタを実行したら、p2のインスタンスにあるそのコンストラクタが実行されて、p2が持っているフィールドが初期化されます。 イメージとしては、p1とp2をそれぞれ宣言したとき、Personクラスのコピーがp1、p2のそれぞれに作られていると考えると、分かりやすいかもしれません。 なので、p1で実行した結果はp1のものですし、p2で実行した結果はp2のものになります。 詳しい話は、検索すればいくらでも出てくるので、調べてみると良いでしょう。
その他の回答 (2)
- osamuy
- ベストアンサー率42% (1231/2878)
> 要は上書きされるのか、showの時にコンストラクタが呼ばれ、その値で出力されるのか、です。 ・p1とp2は別物だから、上書きされることは無い。 ・show()の時に、コンストラクタは呼び出しているわけではない。 デバッガを使って、インスタンスのアドレスが具体的にどんな値をとってるかをプログラムを動かしながら調べては。 抽象的に考えて分からないときは、手を動かしてみるのが、理解への早道。
- Tacosan
- ベストアンサー率23% (3656/15482)
2つ目の new で, なぜ「値が上書きされる」と思ったの?