Referencias Modificador & y palabra clave this

Traspaso de parámetros por referencia

En MQL5 los parámetros de tipos simples pueden ser traspasados por valor y por referencia, mientras que los parámetros de tipos compuestos siempre se traspasan por referencia. Para indicar al compilador la necesidad de traspaso de parámetros por referencia antes del nombre del parámetro se coloca el signo &.

El traspaso de parámetro por referencia significa el paso de dirección de una variable, por eso todas las modificaciones realizadas con el parámetro pasado por referencia en seguida se reflejarán también en la variable original. Al usar el traspaso de parámetros por referencia, se puede organizar al mismo tiempo el retorno de varios resultados desde la función. Para evitar los cambios del parámetro traspasado por referencia, hace falta utilizar el modificador const.

De esa manera, si el parámetro entrante de una función es un array, objeto de estructura o clase, entonces en el encabezado de la función después del tipo de variable y antes de su nombre se pone el signo '&'.

Ejemplo

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

En el ejemplo de arriba se declara la clase CDemoClass que contiene un elemento-array privado m_array[] del tipo double. Se declara la función setArray() en la que el array array[] es traspasado por referencia. Si escribimos el encabezado de la función sin indicar el traspaso por referencia, es decir, quitando el signo de ampersand, durante el intento de compilación de tal código saldrá un mensaje de error.

A pesar de que un array se traspasa por referencia, no podemos realizar la asignación de un array a otro. Es necesario hacer una copia elemento por elemento del contenido de array-fuente al array-receptor. Para los arrays y estructuras a la hora de traspaso en calidad del parámetro de la función  la presencia del signo & es obligatoria durante la descripción de la función.

Palabra clave this

La variable del tipo clase (objeto) puede ser traspasada tanto por referencia, como por puntero. Un puntero, igual como una referencia, sirve para obtener el acceso a un objeto. Después de declarar el puntero a objeto es necesario aplicarle el operador new para su creación e inicialización.

La palabra reservada this sirve para obtener referencia del objeto a si mismo, dicha referencia debe ser accesible dentro de los métodos de la clase o estructura. this siempre hace referencia al objeto en el método del que se utiliza. Y la expresión GetPointer(this) da un puntero al objeto al que pertenece la función en la que se realiza la llamada a la función GetPointer(). En MQL5 las funciones no pueden devolver los objetos pero está permitido devolver el puntero a objetos.

Así, si hace falta que la función devuelva el objeto, podemos devolver el puntero a este objeto a modo de GetPointer(this). Añadamos a la descripción de la clase CDemoClass la función getDemoClass() que devuelve el puntero a objeto de esta clase.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| relleno del array                                               |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| devuelve su propio puntero                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Las estructuras no disponen de punteros, no se les puede aplicar los operadores new y delete, tampoco se puede usar GetPointer(this.

Véase también

Punteros a objetos, Creación y eliminación de objetos, Visibilidad y tiempo de vida de variables