Tham chiếu: Bộ sửa đổi & và Từ khóa this
Truyền Tham số bằng Tham chiếu
Trong MQL5, các tham số của kiểu đơn giản có thể được truyền cả bằng giá trị và bằng tham chiếu, trong khi các tham số của kiểu phức tạp luôn được truyền bằng tham chiếu. Để thông báo cho trình biên dịch rằng một tham số phải được truyền bằng tham chiếu, ký tự &
được thêm vào trước tên tham số.
Truyền một tham số bằng tham chiếu nghĩa là truyền địa chỉ của biến, do đó mọi thay đổi trong tham số được truyền bằng tham chiếu sẽ ngay lập tức được phản ánh trong biến nguồn. Sử dụng việc truyền tham số bằng tham chiếu, bạn có thể thực hiện trả về nhiều kết quả của một hàm cùng một lúc. Để ngăn chặn việc thay đổi một tham số được truyền bằng tham chiếu, hãy sử dụng bộ sửa đổi const.
Do đó, nếu tham số đầu vào của một hàm là một mảng, một cấu trúc hoặc đối tượng lớp, ký hiệu &
được đặt trong tiêu đề hàm sau kiểu biến và trước tên của nó.
Ví dụ
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
};
//+------------------------------------------------------------------+
//| filling the array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array, array);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Trong ví dụ trên, lớp CDemoClass
được khai báo, chứa thành viên riêng - mảng m_array[]
kiểu double. Hàm setArray()
được khai báo, trong đó array[]
được truyền bằng tham chiếu. Nếu tiêu đề hàm không chứa chỉ dẫn về việc truyền bằng tham chiếu, tức là không chứa ký tự &
, một thông báo lỗi sẽ được tạo ra khi cố gắng biên dịch mã như vậy.
Mặc dù mảng được truyền bằng tham chiếu, chúng ta không thể gán một mảng cho mảng khác. Chúng ta cần thực hiện việc sao chép từng phần tử của nội dung từ mảng nguồn sang mảng đích. Sự hiện diện của &
trong mô tả hàm là điều kiện bắt buộc đối với mảng và cấu trúc khi được truyền làm tham số hàm.
Từ khóa this
Một biến kiểu lớp (đối tượng) có thể được truyền cả bằng tham chiếu và bằng con trỏ. Cũng như tham chiếu, con trỏ cho phép truy cập vào một đối tượng. Sau khi con trỏ đối tượng được khai báo, toán tử new nên được áp dụng cho nó để tạo và khởi tạo nó.
Từ khóa dự trữ this
được dùng để lấy tham chiếu của đối tượng tới chính nó, có sẵn bên trong các phương thức của lớp hoặc cấu trúc. this
luôn tham chiếu đến đối tượng mà trong phương thức của nó nó được sử dụng, và biểu thức GetPointer(this
) cung cấp con trỏ của đối tượng mà thành viên của nó là hàm, trong đó lời gọi GetPointer()
được thực hiện. Trong MQL5, các hàm không thể trả về đối tượng, nhưng chúng có thể trả về con trỏ đối tượng.
Do đó, nếu chúng ta cần một hàm trả về một đối tượng, chúng ta có thể trả về con trỏ của đối tượng này dưới dạng GetPointer(this)
. Hãy thêm hàm getDemoClass()
trả về con trỏ của đối tượng của lớp này vào mô tả của CDemoClass
.
class CDemoClass
{
private:
double m_array[];
public:
void setArray(double &array[]);
CDemoClass *getDemoClass();
};
//+------------------------------------------------------------------+
//| filling the array |
//+------------------------------------------------------------------+
void CDemoClass::setArray(double &array[])
{
if(ArraySize(array)>0)
{
ArrayResize(m_array,ArraySize(array));
ArrayCopy(m_array,array);
}
}
//+------------------------------------------------------------------+
//| returns its own pointer |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass(void)
{
return(GetPointer(this));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Cấu trúc không có con trỏ, các toán tử new
và delete
không thể được áp dụng cho chúng, GetPointer(this)
không thể được sử dụng.
Xem thêm
Con trỏ đối tượng, Tạo và xóa đối tượng, Phạm vi hiển thị và tuổi thọ của biến