Referanslar: & Şekillendiricisi ve Anahtar Sözcük this

Parametrelerin Referansla Geçirilmesi

MQL5 içinde basit tipli parametreler değer veya referans ile geçirilirken, bileşik tipli parametreler her zaman referans ile geçirilir. Derleyiciye parametrenin referans ile geçirildiği bilgisini vermek için, parametre isminin önüne ampresan karakteri & eklenir.

Parametrenin referans ile geçirilmesi, değişkenin adresinin geçirilmesi anlamına gelir. Bu yüzden referansla geçirilen parametrelerde yapılan değişiklikler, anında kaynak değişkene yansıyacaktır. Referans ile geçen bir parametre kullanarak, Fonksiyonların çeşitli sonuçlarına aynı anda dönüş yaptırabilirsiniz. Referansla geçirilen parametrelerin değişimini önlemek için const şekillendiricisini kullanabilirsiniz.

Bu şekilde, eğer bir fonksiyonun giriş parametresi bir dizi, bir yapı veya sınıf nesnesi ise, '&' sembolü, fonksiyon isminde değişken tipinden sonra ve kendi isminden önce yer alacaktır.

Örnek

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

Yukarıdaki örnekte, double tipli private m_array[] üye - dizisini içeren CDemoClass sınıfı bildirilmiştir. array[] dizisinin referansla geçirildiği setArray()fonksiyonu da bildirilmiştir. Eğer fonksiyon başlığında referansla geçirme yapılmamışsa, yani ampresan karakteri yoksa, kodun derlenmesi sırasında bir hata mesajı oluşturulur.

Dizinin referans ile geçirilmiş olduğu gerçeğine rağmen, bir diziyi diğerine atayamayız. Kaynak dizinin içeriğini hedef diziye eleman bazında kopyalamamız gerekir. Ampresan & karakterinin fonksiyon tanımındaki varlığı, fonksiyon parametresi şeklinde geçirilen dizi ve yapılar için zorunlu bir koşuldur.

Anahtar Sözcük this

Sınıf tipli bir değişken (nesne) hem referans ile hem de işaretçi ile geçirilebilir. Tıpkı referans gibi işaretçi de bir nesneye erişim sağlamaya yarar. Nesne işaretçisinin bildirilmesinden sonra, bunun oluşturulması ve başlatılması için new operatörü kullanılmalıdır.

this rezerve sözcüğü nesnenin, sınıf veya yapı yöntemleri içinde mevcut olan referansını kendine alması için düşünülmüştür. this sözcüğü, kullanıldığı yöntemde her zaman nesneye referans yapar ve GetPointer(this) ifadesi, üyesi GetPointer() çağrısını gerçekleştiren fonksiyon olan nesnenin işaretçisini verir. MQL5 dilinde fonksiyonlar nesnelere dönüş yapamazlar ama nesne işaretçilerine dönüş yapabilirler.

Bu şekilde, nesneye dönüş yapacak bir fonksiyona ihtiyacımız varsa, nesne işaretçisine GetPointer(this) biçiminde dönüş yapabiliriz. CDemoClass tarifinin içine sınıfın nesnesinin işaretçisine dönüş yapan getDemoClass() fonksiyonunu ekleyelim.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| dizinin doldurulması                                             |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| kendi işaretçisine dönüş yapar                                   |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Yapıların işaretçileri yoktur. new, delete operatörleri ve GetPointer(this) yapılara uygulanamaz.

Ayrıca Bakınız

Nesne İşaretçileri, Nesnelerin Yaratılması ve Silinmesi, Değişkenlerin Görünürlük Alanları ve Ömürleri