Riferimenti: Modificatore & e Parola Chiave this

Passaggio di parametri per Riferimento

In MQL5 parametri di tipo semplice possono essere passati sia per valore che per riferimento, mentre i parametri di tipi composti vengono sempre passati per riferimento. Per informare il compilatore che un parametro deve essere passato per riferimento, il carattere 'e commerciale' & viene aggiunto prima del nome del parametro.

Il passaggio di un parametro per riferimento significa passare l'indirizzo della variabile, è per questo che tutte le variazioni del parametro che viene passato per riferimento verranno immediatamente riflesse nella variabile sorgente. Utilizzando il passaggio di parametro per riferimento, è possibile implementare il ritorno dei svariati risultati di una funzione allo stesso tempo. Al fine di impedire la variazione di un parametro passato per riferimento, utilizzare il modificatore const.

Pertanto, se il parametro di input di una funzione è un array, un oggetto di struttura o di classe, il simbolo '&' viene posto nell'intestazione della funzione dopo il tipo di variabile e prima del nome.

Esempio

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

Nell'esempio sopra la classe viene dichiarata la CDemoClass, la qualeche contiene il membro privato - array m_array[] di tipo double. Funzione setArray() viene dichiarata, alla quale array[] è passato per riferimento. Se l'intestazione funzione non contiene l'indicazione di passaggio per riferimento, cioè non contiene il carattere 'e commerciale', un messaggio di errore viene generato al tentativo di compilare tale codice.

Nonostante il fatto che la matrice viene passata per riferimento, non possiamo assegnare un array ad un altro. Abbiamo bisogno di effettuare la copia elemento-per-elemento dei contenuti della matrice di origine alla matrice destinataria. La presenza dei & nella descrizione della funzione è la condizione obbligatoria per array e strutture quando viene passata come parametro della funzione.

Parola chiave this

Una variabile di tipo classe (oggetto) può essere passata sia per riferimento e per puntatore. Così come per il riferimento, il puntatore permette di avere accesso ad un oggetto. Dopo che il puntatore oggetto viene dichiarato, il nuovo operatore deve essere applicato ad esso per crearlo ed inizializzarlo.

La parola riservata this è designata per ottenere il riferimento dell'oggetto stesso, che è disponibile all'interno di metodi di classe o struttura. this sempre fa riferimento all'oggetto, nel metodo di cui è utilizzato, e l'espressione GetPointer(this) dà il puntatore dell'oggetto, il cui componente è la funzione, in cui viene eseguita la chiamata di GetPointer(). In MQL5 funzioni non possono restituire oggetti, ma possono restituire il puntatore dell'oggetto.

Quindi, se abbiamo bisogno che una funzione restituisca un oggetto, siamo in grado di restituire il puntatore di questo oggetto sottoforma di GetPointer(this). Aggiungiamo la funzione getDemoClass() che restituisce il puntatore del oggetto di questa classe, nella descrizione di CDemoClass.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+--------------------------------------------------------------------------------+
//| riempie l'array                                                                |
//+--------------------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+--------------------------------------------------------------------------------+
//| restituisce il suo puntatore                                                   |
//+--------------------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Le strutture non hanno puntatori, gli operatori new e delete non possono essere applicati ad essi, GetPointer(this) non può essere utilizzato.

Vedi anche

Puntatori Oggetto, Creazione ed Eliminazione di Oggetti, Visibilità Campo e Durata di Variabili