在MQL4编程语言中,参数的传递方式对于函数的使用至关重要。本文将详细介绍两种主要的参数传递方式:值传递和引用传递,并通过示例来解析它们的使用和区别。
值传递
在值传递的方式中,机器语言将参数值复制到函数的形式参数。因此,函数内对此参数的任何更改都不会影响到调用参数。
double ValueMethod(int i, int j)
{
double res;
i *= 2;
j /= 2;
res = i + j;
return(res);
}
void OnStart()
{
int x = 14, y = 8;
Print("x and y before call:", x, " ", y);
double result = ValueMethod(x, y);
Print("x and y after call:", x, " ", y);
}
在这个示例中,即使ValueMethod
函数改变了形式参数i
和j
的值,但是实参x
和y
的值在函数调用前后并未改变。
引用传递
引用传递是另一种方法。在这种情况下,参数的引用(而不是其值)被传递给函数参数。在函数内部,它被用来引用调用中指定的实际参数。这意味着参数的改变将影响用于调用函数的参数。
double RefMethod(int &i, int &j)
{
double res;
i *= 2;
j /= 2;
res = i + j;
return(res);
}
void OnStart()
{
int x = 14, y = 8;
Print("x and y before call:", x, " ", y);
double result = RefMethod(x, y);
Print("x and y after call:", x, " ", y);
}
在这个示例中,RefMethod
函数通过引用传递了x
和y
,函数中对参数的修改导致了x
和y
的值也发生了改变。
值得注意的是,MQL4使用了上述两种方法,但有一种例外:数组、结构类型变量和类对象总是通过引用传递。为了避免实际参数(函数调用时传递的参数)的改变,可以使用const
访问说明符。当试图改变用const
说明符声明的变量的内容时,编译器将产生错误。
参数的传递顺序
需要注意的是,参数是以逆序的方式传递给函数的,即先计算和传递最后一个参数,然后是倒数第二个参数,以此类推。在括号之后的第一个参数是最后计算和传递的参数。
例如:
void OnStart()
{
int a[] = {0,1,2};
int i = 0;
myFunc(a[i], a[i++], "First call (i = "+string(i)+")");
myFunc(a[i++], a[i], "Second call (i = "+string(i)+")");
}
void myFunc(int par1, int par2, string comment)
{
Print(comment, ": par1 = ", par1, " par2 = ", par2);
}
通过理解和应用正确的参数传递方式,可以使我们在使用MQL4编程时写出更加高效和准确的代码。