「クラス」とは「オブジェクト(実体)」の設計図であり、「インスタンス化」という作業を通して「オブジェクト」を生成する、ということを前回と前々回に解説しました。今回はクラスをインスタンス化するときの特殊なメソッドである「コンストラクター」について解説します。聞きなれない言葉かと思いますが、コンストラクターはクラスに取って重要な役割を担っています。
コンストラクターとは
「クラス」から「インスタンス」を生成するときにはnewキーワードを使用することは説明しました。この「インスタンス」を生成するときだけ実行される、特殊な処理が「コンストラクター」になります。
前回は解説しませんでしたが、インスタンスを生成する際には「クラス」から「コンストラクター」の処理をして、そのあとに「インスタンス」が生成されることになっています。コンストラクターには以下の特徴があります。
- newをしたときに呼び出される特殊なメソッド
- クラス名と同じ名前で定義する必要がある
2つ目の「クラス名と同じ名前で定義する必要がある」については、例えば以下のように記述することができます。コンストラクターは「オブジェクトを正しく初期化する」ための特殊なメソッドです。
public class Person
{
//これがコンストラクタ
public Person()
{
//初期化するときの処理
}
}
お気付きかもしれませんが、コンストラクターには戻り値がありませんので、「public クラス名()」と定義しています。以上がコンストラクターの基礎知識でした。次はサンプルコードを交えてコンストラクターをみていきます。
コンストラクターのサンプルコード
それではコンストラクターの処理内容について解説します。新規のコンソールアプリケーションを作成して、以下の内容を記述してみましょう。コードの中身は後ほど解説します。
using System;
namespace App01
{
class Program
{
static void Main(string[] args)
{
//Taroさんをインスタンス化する
Person Taro = new Person();
Taro.Name = "Taro";
Console.WriteLine(Taro.Name);
Console.ReadLine();
}
//人間クラス
public class Person
{
//コンストラクター
public Person()
{
Console.WriteLine("コンストラクター");
}
//名前のプロパティ
public string Name;
}
}
}
この処理を実行してみると以下のように表示されるかと思います。
この出力順序をよく見てみると、コンストラクターがいつ実行されているかが分かると思います。それでは詳細に解説していきます。
クラスの定義
まずは定義したクラスからみていきましょう。今回も前回と同様に「人間」クラスを作るようにしてみました。人間の設計図(クラス)は以下のように定義しています。
//人間クラス
public class Person
{
//コンストラクター
public Person()
{
Console.WriteLine("コンストラクター");
}
//名前のプロパティ
public string Name;
}
コンストラクターの定義と「名前」を設定できるプロパティを持っています。前回までの内容が理解できていれば、コンストラクター以外の部分は問題ないと思います。今回、コンストラクターでは分かりやすように、コンソール画面に「コンストラクター」と表示するようにしています。
本来はコンストラクターに「初期化」の内容を記述するべきなのですが、まずは処理の順序を追いたくて、このような処理を記述しています。
インスタンス化
上記のサンプルでクラスをインスタンス化して、実体を作成しているのが以下の箇所になります。このあたりも解説は不要でしょう。前回解説したインスタンス化するときの記述方法です。
//Taroさんをインスタンス化する
Person Taro = new Person();
この処理を通ることで「Taro」というインスタンス化された「実体」が生成されます。インスタンス変数名は「Taro」となっています。
処理の順序を追ってみよう
先ほど説明した時に「コンストラクターはインスタンス化された時に実行される特殊なメソッド」といいました。サンプルではコンストラクター内に、コンソール画面に「コンストラクター」と表示させる処理を記述しています。
//コンストラクター
public Person()
{
Console.WriteLine("コンストラクター");
}
インスタンスの生成後の処理として記述しているのは、「NameというプロパティにTaroと代入して、その名前を出力する」だけです。
Taro.Name = "Taro";
Console.WriteLine(Taro.Name);
処理結果では「コンストラクター」と表示された後に「Taro」と表示されているため、この処理の順序からみても、きちんとコンストラクターが先に処理されていることがわかるかと思います。
- クラスをインスタンス化する
- コンストラクターが実行される
- インスタンスが生成される
という順番であることがわかりました。これでコンストラクターについての解説は終了です。最後に、もうちょっと本当のコンストラクターの使い方をするサンプルコードを紹介します。
新規のコンソールアプリケーションを作成して、実際に動かしてみてください。先ほどは画面に表示させるだけでしたが、初期化という意味合いを持ったコンストラクターを書いてみることにします。
using System;
namespace App02
{
class Program
{
static void Main(string[] args)
{
//インスタンスを生成する
Person Taro = new Person();
Taro.Name = "Taro";
Console.WriteLine("名前が設定されました。名前:" + Taro.Name);
Console.ReadLine();
}
//人間クラス
public class Person
{
//コンストラクター
public Person()
{
Name = ""; //名前の初期化
Console.WriteLine("初期化されました。名前:" + Name);
}
//名前
public string Name;
}
}
}
上記の内容については特に説明はしませんが、コンストラクター内でNameプロパティの値を初期化して空白にしていることが分かると思います。本来はコンストラクターを使って、このように初期化するために使用されます。
コンストラクターは特殊なメソッド
以上、コンストラクターについて紹介しました。コンストラクターはクラスからインスタンスを生成するときに、正しくオブジェクトを初期化するための特殊なメソッドであり、クラス名と同じ名前でメソッドを定義します。コンストラクターについては、これだけ覚えておけば十分かと思います。