전달 매개 변수

기계어에는 하위 프로그램(함수)에 인수를 전달할 수 있는 두 가지 방법이 있습니다. 첫 번째 방법은 값별로 파라미터를 보내는 것입니다. 이 방법은 인수 값을 형식 함수 매개 변수로 복사합니다. 그러므로, 함수 내에서 이 매개변수의 변경은 해당 호출 인수에 영향을 미치지 않습니다.

//+------------------------------------------------------------------+
//| 값별로 매개 변수 전달                                      |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int a=14,b=8;
   Print("호출 전 a와 b:",a," ",b);
   double d=FirstMethod(a,b);
   Print("호출 후 a와 b:",a," ",b);
  }
//--- 스크립트 실행 결과
//  호출 전 a와 b: 14 8
//  호출 후 a와 b: 14 8

두 번째 방법은 레퍼런스로 통과시키는 것입니다. 이 경우 파라미터(값이 아님)에 대한 참조가 함수 파라미터로 전달됩니다. 함수 내부에서는 호출에 지정된 실제 파라미터를 나타내는 데 사용됩니다. 이는 매개변수 변경사항이 함수를 호출하는 데 사용되는 인수에 영향을 미친다는 것을 의미합니다.

//+------------------------------------------------------------------+
//| 레퍼런스를 통해 매개 변수 전달                                  |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| 스크립트 프로그램 시작 함수                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int a=14,b=8;
   Print("호출 전 a와 b:",a," ",b);
   double d=SecondMethod(a,b);
   Print("호출 후 a와 b:",a," ",b);
  }
//+------------------------------------------------------------------+
//--- 스크립트 실행 결과
//  호출 전 a와 b: 14 8
//  호출 후 a와 b: 28 4

MQL5는 두 가지 방법을 모두 사용합니다. 단, 배열, 구조 유형 변수 및 클래스 개체는 항상 참조를 통해 전달됩니다. 실제 매개변수(함수 호출 시 전달되는 인수)의 변경을 방지하려면 액세스 지정자 const를 사용합니다. const 지정자로 선언된 변수의 내용을 변경하려고 하면 컴파일러에서 오류가 발생합니다.

참고

매개변수는 역순으로 함수에 전달됩니다. 즉, 먼저 마지막 매개변수를 계산하여 전달한 다음 마지막 매개변수를 제외한 나머지 매개변수가 전달됩니다. 마지막으로 계산하여 통과한 파라미터는 괄호를 열고 맨 앞에 있는 파라미터입니다.

예제:

void OnStart()
  {
//---
   int a[]={0,1,2};
   int i=0;
 
   func(a[i],a[i++],"First call (i = "+string(i)+")");
   func(a[i++],a[i],"Second call (i = "+string(i)+")");
// Result:
// First call (i = 0) : par1 = 1     par2 = 0
// Second call (i = 1) : par1 = 1     par2 = 1
 
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void func(int par1,int par2,string comment)
  {
   Print(comment,": par1 = ",par1,"    par2 = ",par2);
  }

첫 번째 호출에서(위의 예 참조) i 변수는 문자열 연결에 처음 사용됩니다:

  "First call (i = "+string(i)+")"

여기서 그것의 값은 변하지 않습니다. 그런 다음 i 변수가 a[i++] 배열 요소를 계산할 때 사용되는데, 즉, 인덱스 i가 있는 배열 요소에 액세스할 때, i 변수는 증가됩니다. 그리고 그 후에만 i 변수의 값이 변경된 첫 번째 파라미터가 계산됩니다.

두 번째 호출에서는 세 개의 파라미터를 모두 계산할 때 동일한 값 i(함수 호출의 첫 번째 페이즈에서 계산됨)가 사용됩니다. 첫 번째 파라미터를 계산한 후에만 i 변수가 다시 변경됩니다.

더 보기

가시성 범위 및 변수의 수명, 오버로드, 가상 함수, 다형성