Références : Modificateur & et Mot-Clé this

Passage de Paramètres par Référence

En MQL5, les paramètres des types simples peuvent être passés à la fois par valeur et par référence, tandis que les paramètres des types composés sont toujours passés par référence. Pour informer le compilateur qu'un paramètre doit être passé par référence, le caractère esperluette (ou "et commercial") & est ajouté avant le nom du paramètre.

Passer un paramètre par référence signifie passer l'adresse de la variable, c'est pourquoi tous les changements dans un paramètre passé par référence sont immédiatement reflétés dans la variable source. Grâce aux paramètres passés par référence, vous pouvez implémenter le retour de plusieurs résultats d'une fonction en même temps. Afin d'empêcher le changement d'un paramètre passé par référence, utilisez le modificateur const.

Ainsi, si le paramètre d'entrée d'une fonction est un tableau, une structure ou un objet de classe, un symbole '&' est placé dans la signature de la fonction après le type de la variable et avant son nom.

Exemple

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

Dans l'exemple ci-dessus, la classe CDemoClass déclarée contient le membre privé - m_array[] tableau de données de type double. La fonction setArray() est déclarée et prend un tableau array[] passé par référence. Si la signature de la fonction ne contient pas d'indication sur un passage par référence, c'est à dire qu'il ne contient pas le caractère &, un message d'erreur sera généré au moment de la compilation du code.

En dépit du fait que le tableau est passé par référence, il n'est pas possible d'affecter un tableau à un autre. Il faut effectuer la copie du contenu des éléments du tableau source dans le tableau destination un par un. La présence du caractère & dans la signature de la fonction est la condition obligatoire pour les tableaux et les structures passés comme paramètre de fonction.

Mot-Clé this

Une variable de type class (objet) peut être passée à la fois par référence et par pointeur. Comme une référence, le pointeur permet d'avoir accès à un objet. Une fois que le pointeur de l'objet est déclaré, l'opérateur new doit être utilisé pour le créer et l'initialiser.

Le mot-clé réservé this permet d'obtenir la référence de l'objet sur lui-même, et est disponible dans les méthodes d'une classe ou d'une structure. this référence toujours l'objet dans la méthode dans laquelle il est utilisé et l'expression GetPointer(this) retourne le pointeur de l'objet dans la fonction dans laquelle l'appel est effectué. En MQL5, les fonctions ne peuvent pas retourner d'objet, mais peuvent retourner un pointeur d'objet.

Donc, si nous avons besoin d'une fonction retournant un objet, nous pouvons retourner un pointeur sur cet objet grâce à GetPointer(this). Ajoutons dans la classe CDemoClass une fonction getDemoClass() retournant un pointeur sur l'objet de cette classe.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| Remplissage du tableau                                           |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| retourne son propre pointeur                                     |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Les structures n'ont pas de pointeurs, les opérateurs new et delete ne peuvent pas être appliqués, GetPointer(this) ne peut pas être utilisé.

Voir aussi

Pointeurs d'Objets, Créer et Supprimer des Objets, Portée de Visibilité et Cycle de Vie des Variables