在MQL4编程中,可以通过值和引用两种方式传递简单类型的参数,而复合类型的参数则总是通过引用传递。为了告诉编译器一个参数必须通过引用传递,我们在参数名称前加上&字符。
通过引用传递参数意味着传递变量的地址,这就是为什么通过引用传递的参数中的所有更改都会立即反映在源变量中。通过引用传递参数,您可以同时实现函数的多个结果的返回。为了防止更改通过引用传递的参数,可以使用const修饰符。
因此,如果函数的输入参数是数组、结构或类对象,那么在函数头部的变量类型后面和名称前面放置’&’符号。
示例:
class MyTestClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
};
void MyTestClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}
在上述示例中,声明了包含私有成员 – double类型数组m_array[]的MyTestClass类。声明了setArray()函数,该函数通过引用传递array[]。如果函数头部没有关于通过引用传递的说明,即没有&字符,那么在尝试编译此类代码时将生成错误消息。
尽管数组是通过引用传递的,但我们不能将一个数组分配给另一个数组。我们需要对源数组的内容进行元素级复制到接收数组。在函数描述中有&符号是将数组和结构作为函数参数传递时的必要条件。
关键字this
类类型(对象)的变量可以通过引用和指针两种方式传递。指针也允许访问对象。声明对象指针后,应用new操作符来创建和初始化它。
保留字this用于获取对象对自身的引用,这在类或结构方法内部可用。this总是引用在其方法中使用的对象,表达式GetPointer(this)给出了对象的指针,该对象是调用GetPointer()的函数的成员。在MQL4中,函数不能返回对象,但它们可以返回对象指针。
因此,如果我们需要一个函数返回一个对象,我们可以以GetPointer(this)的形式返回这个对象的指针。让我们在CDemoClass的描述中添加getDemoClass()函数,该函数返回这个类对象的指针。
class MyTestClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
MyTestClass *getTestClass();
};
void MyTestClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
MyTestClass *MyTestClass::getTestClass(void)
{
return(GetPointer(this));
}
结构没有指针,不能对它们应用new和delete操作符,也不能使用GetPointer(this)。