Ссылки. Модификатор & и ключевое слово this

Передача параметров по ссылке

В MQL5 параметры простых типов можно передавать как по значению, так и по ссылке, в то время как параметры сложных типов всегда передаются по ссылке. Для указания компилятору на необходимость передачи параметра по ссылке, перед именем параметра ставится знак амперсанда &.

Передача параметра по ссылке означает передачу адреса переменной, поэтому все изменения, произведенные над переданным по ссылке параметром, сразу же отобразятся и в исходной переменной. Используя передачу параметров по ссылке можно организовать возврат одновременно нескольких результатов из функции. Чтобы предотвратить изменение переданного по ссылке параметра, необходимо использовать модификатор const.

Таким образом, если входной параметр функции является массивом, объектом структуры или класса, то в заголовке функции после типа переменной и перед ее именем ставится символ '&'.

Пример

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
  };
//+------------------------------------------------------------------+
//| заполнение массива                                               |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
     ArrayResize(m_array,ArraySize(array));
     ArrayCopy(m_array, array);
     }
  }

В вышеприведенном примере объявлен класс CDemoClass, который содержит приватный член - массив m_array[] типа double. Объявлена функция setArray(), в которую по ссылке передается массив array[]. Если заголовок функции написать без указания передачи по ссылке, т.е. убрать знак амперсанда, то при попытке компиляции такого кода будет выдано сообщение об ошибке.

Несмотря на то, что массив передается по ссылке, мы не можем произвести присвоение одного массива другому. Необходимо сделать поэлементное копирование содержимого массива-источника в массив-приемник. Наличие символа & для массивов и структур при передаче в качестве параметра функции является обязательным при описании функции.

Ключевое слово this

Переменная типа класса (объект) может передаваться как по ссылке, так и по указателю. Указатель как и ссылка служит для того чтобы получать доступ к объекту. После объявления указателя объекта необходимо применить к нему оператор new для его создания и инициализации.

Зарезервированное слово this предназначено для получения ссылки объекта на самого себя, доступной внутри методов класса или структуры. this всегда ссылается на объект, в методе которого используется, а выражение GetPointer(this) даёт указатель объекта, членом которого является функция, в которой осуществлен вызов функции GetPointer(). В MQL5 функции не могут возвращать объекты, но разрешено возвращать указатель объекта.

Таким образом, если необходимо, чтобы функция вернула объект, то мы можем вернуть указатель этого объекта в виде  GetPointer(this). Добавим в описание класса CDemoClass функцию getDemoClass(), которая возвращает указатель объекта этого класса.

class CDemoClass
  {
private:
   double            m_array[];
 
public:
   void              setArray(double &array[]);
   CDemoClass       *getDemoClass();
  };
//+------------------------------------------------------------------+
//| заполнение массива                                               |
//+------------------------------------------------------------------+
void  CDemoClass::setArray(double &array[])
  {
   if(ArraySize(array)>0)
     {
      ArrayResize(m_array,ArraySize(array));
      ArrayCopy(m_array,array);
     }
  }
//+------------------------------------------------------------------+
//| возвращает собственный указатель                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
  {
   return(GetPointer(this));
  }

Структуры не имеют указателей, к ним нельзя применять операторы new и delete, и нельзя использовать GetPointer(this).

Смотри также

Указатели объектов, Создание и уничтожение объектов, Область видимости и время жизни переменных