跳至内容
References: Modifier & and Keyword this

References: Modifier & and Keyword this

参考文献:修饰符 & 和关键字 this

通过引用传递参数

在 MQL4 中,简单 类型的参数可以通过值和引用两种方式传递,而 复合 类型的参数总是通过引用传递。为了告知编译器某个参数必须通过引用传递,需要在参数名称前添加 & 符号。

通过引用传递参数意味着传递变量的地址,因此通过引用传递的参数所做的所有更改将立即反映在源变量上。使用通过引用传递参数,可以同时实现函数的多个结果返回。为了防止通过引用传递的参数被修改,需要使用 const 修饰符。

例如,如果函数的输入参数是 数组、结构或类对象,那么在函数头中,应在变量类型之后、名称之前放置 & 符号。

示例

class CDemoClass
  {
private:
   double            m_array[];

public:
   void              setArray(double &array[]);
  };
//+------------------------------------------------------------------+
//| filling the array                                                |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
     ArrayResize(m_array,ArraySize(array));
     ArrayCopy(m_array, array);
     }
  }

在上面的示例中,声明了 class CDemoClass,它包含 私有 成员 - 类型为 double 的数组 m_array[]。声明了 函数 setArray(),将数组[]通过引用传递给该函数。如果函数头中没有关于通过引用传递的指示,即没有 & 符号,那么在尝试编译此类代码时会生成错误消息。

尽管数组是通过引用传递的,我们不能将一个数组赋给另一个数组。我们需要执行源数组内容到接收数组的逐元素复制。当数组和结构作为函数参数传递时,函数描述中包含 & 是必需的条件。

关键字 this

类类型变量(对象)可以通过引用和 指针 传递。与引用一样,指针也可以访问对象。在声明了对象指针后,应使用 new 运算符来创建并初始化该对象。

保留字 this 用于获取对象自身的引用,这在类或结构方法中可用。this 始终引用使用它的方法中的对象,表达式 GetPointer(this) 提供了执行 GetPointer() 调用的对象的指针。在 MQL4 中,函数不能返回对象,但可以返回对象指针。

因此,如果我们需要一个函数返回对象,可以以 GetPointer(this) 的形式返回该对象的指针。我们在 CDemoClass 的描述中添加函数 getDemoClass(),该函数返回该类的对象指针。

class CDemoClass
  {
private:
   double            m_array[];

public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| filling the array                                                |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| returns its own pointer                                          |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

结构没有指针,无法应用 new 和 delete 运算符,也无法使用 GetPointer(this)。

另请参阅

对象指针创建和删除对象变量的可见性范围与生命周期

最后更新于