MQL5超入門(6)/const 修飾子

indicator からObjectCreate ができない問題は…1つのチャートで複数のEAを動かせる仕様になりそうな話が本家フォーラムで出てきました。いつ実現するのかは分かりませんが、妥当な解決策なのではと思っています..。


それよりも・・・ここ何日か、本家でのHelpファイルの更新が止まっているので、もしかして8月中のベータテスト開始も無理なの???
なんて悪い予感を感じつつ…MQL5超入門の第六回です。(ーー;


今日は、const 修飾子を紹介します。


const 修飾子は、特定の関数の中で、「この変数は値を変更しません」宣言をする時に使います。
具体的には、

int  MyFunction (const int &a, int &b) //引数リストの中で、値を変えたくない変数の先頭に const をつける
{                                     
  int c;
  b = b + 1; // const 宣言した a の値は変更できないが、そうではない b は値を変えられる
  c = a + b;
  return(c)
}

のように書きます。
このプログラムで、const と書いても書かなくても、関数の計算結果はまったく変わりません。
それでは意味ないじゃん!と思われるかもしれませんが、さにあらず。


const の役割は、一般には 2 種類あって
(1) プログラムミスを見つけやすくする。
(2) コンパイラがプログラムを最適化しやすくする。

があります。
MQL5 で、(2) の最適化がどこまで効くのかは分かりませんが、(1) は有効だと想像しています。


うっかりミスをして以下のようなコードを書くと

int  MyFunction (const int &a, int &b) // a の先頭に const をつける
{
  int c;
  a = a + 1; // 変更しない宣言をしている a を変えようとしている !!
  c = a + b;
  return(c)
}

コンパイル時にエラーがでる・・・はずです。




MQL5 の標準関数の中には、const 宣言しているモノがいくつかあって、
例えば、indicator にとっての start() 関数に替わるOnCalculate() でも使われています。

int OnCalculate(const int rates_total, //価格データ配列の総数
                const int prev_calculated, //前回のOnCalculate呼び出し時に計算したデータ数
                const int begin, //意味のあるデータの開始位置(現在、意味不明です..)
                const double &price[] //価格データ配列
);

こんな風に宣言されているOnCalculate() の中で、

rates_total = rates_total - 1;
prev_calculated = 0;
price[0] = price[1];

などと書くとエラーになるのでご注意ください。