참조: 수식어 & 키워드 this

참조로 매개 변수 전달

MQL5에서 simple 유형의 매개 변수는 값과 참조를 모두 전달할 수 있지만, compound 유형의 매개 변수는 항상 참조를 통해 전달됩니다. 컴파일러에게 매개 변수가 참조를 통해 전달되어야 함을 알리려면 매개 변수 이름 앞에 ampersand 문자 &가 추가됩니다.

참조로 매개 변수를 전달한다는 것은 변수의 주소를 전달하는 것을 의미하며, 따라서 참조로 전달되는 매개 변수의 모든 변경 사항이 소스 변수에 즉시 반영됩니다. 참조를 통과하는 매개변수를 사용하여 함수의 여러 결과에 대한 반환을 동시에 구현할 수 있습니다. 참조에서 전달된 매개변수의 변경을 방지하려면 const 한정자를 사용하십시오.

따라서 함수의 입력 매개변수가 구조체 또는 클래스 객체인 array인 경우, 기호 '&'는 변수 형식과 이름 앞에 함수 헤더에 배치됩니다.

예제

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);
    }
  }

위의 예에서는 class CDemoClass가 선언되었으며, 여기에는 private 멤버 - double 유형의 m_array[] 배열이 포함됩니다. 함수 setArray() 가 선언되었으며, 이 함수에는 array[] 가 레퍼런스를 통해 전달됩니다. 함수 헤더에 참조 통과에 대한 표시가 없는 경우(예: 앰퍼샌드 문자가 없는 경우), 이러한 코드를 컴파일하려고 할 때 오류 메시지가 생성됩니다.

어레이가 참조를 통해 전달되지만 한 어레이를 다른 어레이에 할당할 수는 없습니다. 원본 배열의 내용을 요소별로 수신자 배열에 복사해야 합니다. 함수 설명에 &가 있는 것은 함수 매개변수로 전달될 때 배열 및 구조물에 대한 필수 조건입니다.

키워드 this

클래스 유형(개체)의 변수는 참조 및 포인트를 통해 전달될 수 있습니다. 레퍼런스뿐만 아니라 포인터를 사용하면 객체에 액세스할 수 있습니다. 객체 포인터 선언 후에는 new 연산자를 사용하여 포인터를 만들고 초기화해야 합니다.

유보어인 this는 클래스 또는 구조 메서드 내에서 사용할 수 있는 개체의 참조를 얻기 위한 것입니다. this는 항상 개체를 사용하는 방법으로 참조하며 GetPointer(this) 식은 GetPointer() 호출을 수행하는 함수인 개체의 포인터를 제공합니다. MQL5에서 함수는 객체를 반환할 수 없지만 객체 포인터를 반환할 수 있습니다.

따라서 개체를 반환하는 함수가 필요한 경우 GetPointer(this) 형식으로 이 개체의 포인터를 반환할 수 있습니다. 이 클래스의 개체에 대한 포인터를 반환하는 getDemoClass() 함수를 CDemoClass의 설명에 추가하겠습니다.

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삭제 를 적용할 수없으며, GetPointer(this)를 사용할 수 없습니다.

더 보기

객체 포인터, 객체 생성 및 삭제, 가시성 범위 및 변수 수명