改めて前回の内容をおさらいをしておくと、
- 今あるクラスを一つのテンプレートとして作られたクラスを派生クラスという。
- 派生クラスは、classキーワード→ 派生クラス名 →コロン(:) →public 派生元のクラス名という記述手順を踏んで作られる。
- 派生クラスは、privateレベル以外の派生元クラスのメンバーを呼び出すことができる。
- 派生クラスは継承するメンバーの他に、自分のクラスのメンバーを追加してさらにクラスの機能を拡張することができる。
ということをお伝えしました。
今回は コンストラクタ についてお話ししたいと思います。
コンストラクタとは?
コンストラクタ とは
クラスのインスタンスを生成した段階で、発動するクラスのメンバ関数のことです。
↑だけ読んでも全然ピンとこないと思います。もう少しだけ我慢してください<m(__)m>
※インスタンスについては大丈夫でしょうか?
インスタンス→クラスや構造体を実際に使う時に宣言する、変数名のようなものでしたね。
詳しいことは、
MQL5 EA講座 第49回「クラスについて2 -クラスの使い方-」
またこの後予定しているMQL5 EA講座 第54回「インスタンスについて」
等をご確認ください。
※メンバとはクラスや構造体の中で定義された、個々の変数や関数のことです。
普通、クラスのメンバ関数を利用する際は、まずインスタンスを生成し、そのインスタンスからメンバ関数を呼び出す必要があります。
それに対して、コンストラクタはインスタンスを生成した時点で、定義した関数処理を行ってくれます。↓
動画を見てもらうとわかる通り、サンプルコードでは、グローバル領域でインスタンスを生成後、OnStart関数で一切呼び出していないにも関わらず、コンストラクタのログ出力処理がなされているのがわかります。
※グローバル領域とは関数の外の領域のことです。
このように、コンストラクタの特筆すべき点は、クラスのインスタンスを生成した段階で関数処理が実行されることにあります。
そのため、EAにおいても、変数や配列を初期化する時などに、多く用いられます。
コンストラクタの作り方
コンストラクタもメンバ関数なので、他のメンバ関数と同様にクラスの{}内に関数宣言をして、処理実装記述を定義していきます。(そのあたりの詳細は、第48回「クラスについて1 -クラスとは?-」をご覧ください)
コンストラクタのルール1:コンストラクタのデータ型は常にvoid
コンストラクタを宣言する際にデータ型の指定は不要です。(別にvoid をつけてもコンパイルエラーにはなりません)
コンストラクタのルール2:コンストラクタの名前はクラスの名前と同じ
コンストラクタはクラス名と同名である事をもってコンストラクタと認識されます。
またコンストラクタの機能から自ずとアクセスレベルはpublic に限定されます。
//クラスの宣言
class exampleClass
{
//コンストラクタの宣言(クラス名「exampleClass」と同じ名前を付ける
public:
exampleClass(){Print("コンストラクタ");};
};
あとは、クラスのインスタンスを生成すれば、自動的にコンストラクタの処理が発動されるのは、見て頂いた通りです。(ここでは、処理記述をインライン定義で済ませていますが、もちろんグローバル領域にて処理記述を定義することもできます)
※逆に、コンストラクタをOnStart関数などのイベントハンドラーから、通常のメンバ関数と同じように呼び出そうとした場合、「explicit constructor call not allowed (明示的なコンストラクタの呼び出しは許可されていません)」というコンパイルエラーが発生します。
//クラスの宣言
class exampleClass
{
//コンストラクタの宣言
public:
exampleClass(){Print("コンストラクタ");};
};
//exampleClassのインスタンスを宣言
exampleClass ex;
void OnStart()
{
//コンストラクタの明示的な呼び出しはエラーになる。
ex.exampleClass();
}
↑のサンプルコードを実際にコンパイルしてみると・・・↓
おまけ
<その1:クラスと同名のメンバ関数に戻り値を設定しようとした場合>
もし、クラスと同名のメンバ関数に戻り値を設定しようとした場合はどうなるでしょうか?
クラスと同名のメンバ関数=コンストラクタであり、コンストラクタ→void型なので、「’return’ – ‘void’ function returns a value」というコンパイルエラーが発生します。
↓の動画では途中で、関数名をクラス名とは違う名前に変えることによって、コンパイルエラーが解消されているのがわかると思います。
合わせて「constructor must be of the void type (コンストラクタはvoid型でなくてはいけません)」という警告も発されていますね。
<その2:コンストラクタのアクセスレベルをpublicに変えようとした場合>
コンストラクタの役割が、「クラスのインスタンスの生成時に発動する関数」であることから、コンストラクタのアクセスレベルは必然的にpublicに限定されているわけですが、ではアクセスレベルをprivateやprotectedにするとどうなるかというと・・・言うまでもなくコンパイルエラーが発生します。↓
今回の記事を読んで、コンストラクタの仕組みはわかっても、実際のEA(自動売買プログラム)開発においてどうやって使うのか?という事は今はイメージしづらいかもしれません。今後の講座記事においては、
・MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」
・MQL5 EA講座 第109回「インジケータの値を簡単に取得できるクラスを作る」
で、コンストラクタを利用したコード記述解説を行っていますので、楽しみにして頂ければと思います。
※クラスの実際の使用例に関しては、今後の講座記事にはなりますが、以下の記事で解説していますので、今はよくわからなくてもご安心ください。
・MQL5 EA講座 第71回「トレード用のオリジナルクラスを作る」
・MQL5 EA講座 第82回「ポジション情報管理クラスを作る-その1」
・MQL5 EA講座 第83回「ポジション情報管理クラスを作る-その2」
・MQL5 EA講座 第88回「待機注文情報取得用のクラスを追加する」
・MQL5 EA講座 第96回「トレーリングストップクラスを作る1」
・MQL5 EA講座 第97回「トレーリングストップクラスを作る2」
・MQL5 EA講座 第100回「ブレイクイーブンストップ関数を作る」
コメント