Referenzen. Modifikator & und Schluesselwort this

Übertragung der Parameter durch Referenz

In MQL5 können Parameter einfacher Typen nach dem Wert und durch Referenz übertragen werden, während Parameter komplizierter Typen werden immer durch Referenz übertragen. Für Andeutung dem Compiler auf die Notwendigkeit, einen Parameter durch Referenz zu übertragen wird vor dem Namen des Parameters das Zeichen Ampersand & gestellt.

Übertragung des Parameters durch Referenz bedeutet die Übertragung der Adresse einer Variable, darum werden alle Veränderungen des übertragenen durch Referenz Parameters werden sofort in der Ausgangsvariable dargestellt. Beim Verwenden von Parameterübertragung durch Referenz kann man gleichzeitige Rückkehr mehrerer Ergebnisse aus der Funktion ermöglichen. Man muss den Modifikator const verwenden, um der Veränderung des durch Referenz übertragenen Parameters zu.

So wenn der Eingabeparameter der Funktion ein Feld, Objekt einer Struktur oder einer Klasse ist, wird im Header der Funktion nach dem Typ der Variable und vor ihrem Namen das Symbol  '&' gestellt.

Beispiel

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

In dem angeführten Beispiel ist die Klasse CDemoClass erklärt, die ein privates Glied enthält  - Feld m_array[] des Typs double. Die Funktion setArray(), in die durch Referenz das Feld array[] übertragen wird, ist erklärt. Wenn Header dieser Funktion ohne Andeutung der Übertragung durch Referenz geschrieben wird, d.h. das Symbol Ampersand  wird weggenommen, wird beim Versuch, diesen Kode zu compilieren, eine Fehlernachricht erscheinen.  

Abgesehen davon, dass das Feld durch Referenz übertragen wird, können wir nicht ein Feld einem anderen Feld zuordnen. Man muss den Inhalt von Feld-Quelle ins Feld-Rezipient elementenweise kopieren. Das Symbol & für Felder und Strukturen bei der Übertragung als Parameter der Funktion ist bei der Funktionsbeschreibung notwendig.

Schluesselwort this

Variable des Typs Klasse (Objekt) kann sowohl durch Referenz, als auch durch Anzeiger übertragen werden. Anzeiger, wie auch Referenz verwendet man, um Zugang zum Objekt zu bekommen. Nach der Erklaerung von Objektanzeiger muss man die Anweisung new für seine Erzeugung und Initialisierung verwenden.

Das reservierte Wort this ist für Erhaltung der Referenz des Objektes auf sich selbst bestimmt. Sie ist innerhalb der Klassenmethoden oder Strukturenmethoden zugaenglich. this verweist immer auf das Objekt, in dessen Methode es verwendet wird, und der Ausdruck GetPointer(this) gibt Anzeiger des Objektes, dessen Glied die Funktion ist, in der die Funktion GetPointer() aufgerufen wurde. In MQL5 können die Funktionen keine Obkekte rückgeben, aber sie können Objektanzeiger rückgeben.  

D.h. wenn es notwendig ist, dass die Funktion das Objekt rückgibt, koenen wir den Anzeiger dieses Objektes als GetPointer(this) rückgeben. Fuegen wir in die Beschreibung der Klasse CDemoClassdie Funktion getDemoClass() hinzu, die Objektanzeiger dieser Klasse rückgibt.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| Feldausfuellung                                               |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| gibt eigenen Anzeiger zurück                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Strukturen haben keine Anzeiger, man kann die Anweisungen new und delete zu ihnen nicht anwenden, GetPointer(this) kann auch nicht verwendet werden.

Sehen Sie auch

Objektanzeiger, Erzeugung und Entfernung von Objekten, Sichtbarkeitsbereich und Lebensdauer der Variablen