引用,修饰符&和关键字this

通过引用传送参数

在MQL5的简单类型参数能够通过值和引用传送,而复合类型参数经常通过引用传送。若使编译器了解参数是通过引用传送,需要在参数前加上 & 符号。

通过引用传送参数意味着传送变量地址,这就是通过引用传送的参数的所有改变能够马上在变量源中反映出来的原因。使用通过引用传送的参数,一个函数可以同时得出几种结果。为防止引用传送的参数改变,使用常量修饰符。

因此,函数输入参数是一个数组,结构或者类,符号'&'放在函数表头,变量类型后,名字前。

示例:

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被声明-双精度型数组 m_array[] 。函数 setArray()被声明,通过引用传送array[]到这里。如果函数表头不包括通过引用传送的指示,例如,不包括&符号,并且编译这个符号时会生成错误信息。

即使数组是通过引用传送的,我们仍不能把一个数组定义到另一个。我们需要将数组源里逐元素复制成可接受的数组。函数描述中&是数组和结构传送成函数参数必要的状态。

关键字 this

类型(object)变量可以通过引用和指针传送。如引用一样,指针允许访问目标。目标指针声明后,就会应用操作去创建和初始化。

关键字this意在获得目标的引用,可以在类或者结构函数里得到。this经常引用到目标中,并在此函数中使用,表达式 GetPointer(this) 给出目标指针,其成员为完成GetPointer()的函数。在MQL5中,函数不能返回对象,但是它们能返回目标指针。

因此,如果我们需要函数返回对象,我们能够在GetPointer(this)形式下返回目标指针。我们将这个类的目标指针函数getDemoClass()添加到CDemoClass描述。

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));
  }

结构没有指针,新建和删除操作不能应用其上,不可以用GetPointer(this)。

另见

目标指针创建和删除对象可见范围和变量使用期