MQL5 リファレンス言語基礎データ型参照: 修飾子「 & 」とキーワード「 this 」 

参照: 修飾子「 & 」とキーワード「 this 」

参照でのパラメータの引き渡し

MQL5では基本データ型のパラメータは値と参照の両方によって渡されることが出来ますが、複合型のパラメータは常に参照によって渡されます。パラメータが参照によって渡される必要があるとコンパイラに知らせるには、アンパサンド「 & 」がパラメータ名の前に追加されます。

参照によってパラメータを渡すことは変数のアドレスを渡すことを意味します。よって、参照によって渡されたパラメータの変更はすぐにソース変数に反映されます。参照によってパラメータを渡すことによって、関数のいくつかの結果を同時に返すことが出来ます。参照によって渡されたパラメータの変更を防ぐには const 修飾子を使用します。

関数の入力パラメータが配列や構造体またはクラスのオブジェクトの場合は、「 & 」シンボルが関数ヘッダー内で変数の型と名称の間に配置されます。

class CDemoClass
 {
private:
  double            m_array[];
 
public:
  void              setArray(double &array[]);
 };
//+------------------------------------------------------------------+
//| 配列に書き込む                                                      |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
 {
  if(ArraySize(array)>0)
    {
    ArrayResize(m_array,ArraySize(array));
    ArrayCopy(m_array, array);
    }
 }

上記の例ではクラス CDemoClass が宣言され、private メンバである double 型の配列 m_array[]  を含みます。関数 setArray() が宣言され、array[] が参照で渡されます。関数ヘッダーに参照での受け渡しについての指示が含まれていない場合、つまり、アンパサンドが含まれていない場合、コードをコンパイルが試まれるとエラーメッセージが生成されます。

配列が参照によって渡されるという事実にもかかわらず、配列を別の配列に割り当てることは出来ません。元の配列の内容を要素単位で受け取り側の配列に複製する必要があります。配列や構造体が関数のパラメータとして渡された時に関数の記述に「 & 」を含むことは絶対条件です。

「 this 」キーワード

クラス型(オブジェクト)の変数は、参照によってもポインタによっても受け渡し出来ます。参照と同様に、ポインタはオブジェクトへのアクセスを可能にします。オブジェクトポインタは、宣言後に new オペレータの適用によって作成及び初期化されるべきです。

予約語「 this 」はクラスまたは構造体のメソッド内で自身へのオブジェクトの参照を得るために使用されます。「 this 」は常に、それが使用されているメソッドでオブジェクトを参照します。GetPointer(this) は GetPointer() の呼び出しが行われるメンバ関数内でのオブジェクトのポインタを提供します。MQL5 では関数はオブジェクトを返すことは出来ませんが、オブジェクトポインタを返すことは出来ます。

オブジェクトを返す関数が必要な場合は、GetPointer(this) を使用してオブジェクトのポインタを返すことが出来ます。CDemoClass の記述に、このクラスのオブジェクトのポインタを返す関数の getDemoClass() を追加してみましょう。

class CDemoClass
 {
private:
  double            m_array[];
 
public:
  void              setArray(double &array[]);
  CDemoClass       *getDemoClass();
 };
//+------------------------------------------------------------------+
//| 配列に書き込む                                                      |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
 {
  if(ArraySize(array)>0)
    {
    ArrayResize(m_array,ArraySize(array));
    ArrayCopy(m_array,array);
    }
 }
//+------------------------------------------------------------------+
//| 自分へのポインタを返す                                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
 {
  return(GetPointer(this));
 }

構造体にはポインタがないので、new 及び delete 演算子や GetPointer(this) は適用出来ません。

参照

オブジェクトポインタオブジェクトの作成と解除変数のアクセス権スコープとライフタイム