#property strict/******************************************************************************/class A {
public:
/******************************************************************************/
A() {
Print("class A: Конструктор по умолчанию");
}
/******************************************************************************/
A(const A &a) {
Print("class A: Конструктор копии");
}
/******************************************************************************/void operator =(const A &a) {
Print("class A: Оператор присваивания");
}
};
/******************************************************************************/void assign(A &l, A &r) {
Print("Функция assign()");
l = r;
}
/******************************************************************************/voidOnStart() {
Print("OnStart(): Создаём по умолчанию");
A a;
Print("OnStart(): Получаем \"адрес\" первого объекта");
A *p = GetPointer(a);
Print("OnStart(): Создаём копию, прямо инициализируя предыдущим объектом");
A b(a);
Print("OnStart(): Выполняем присваивание, используя предыдущий объект");
b = a;
Print("OnStart(): Создаём копию, прямо инициализируя так называемым \"указателем\" на предыдущий объект");
A c(p);
Print("OnStart(): Выполняем присваивание, используя так называемый \"указатель\" на предыдущий объект");
b = p;
Print("OnStart(): Выполняем присваивание так называемому \"указателю\" значения его же самого");
p = p;
// *p = *p; Ошибка: '*' - unexpected token, то есть, присвоить объекту другой объект, если есть "адреса" обоих объектов, не так-то просто...Print("OnStart(): Выполняем присваивание объекту по \"адресу\" значения его же самого с помощью вспомогательной функции");
assign(p, p);
}
该程序编译并成功运行。
22:23:46 Script 3 EURUSDm,H1: loaded successfully
22:23:463 EURUSDm,H1: initialized
22:23:463 EURUSDm,H1: OnStart(): Создаём по умолчанию
22:23:463 EURUSDm,H1: class A: Конструктор по умолчанию
22:23:463 EURUSDm,H1: OnStart(): Получаем "адрес" первого объекта
22:23:463 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя предыдущим объектом
22:23:463 EURUSDm,H1: class A: Конструктор копии
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание, используя предыдущий объект
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: OnStart(): Создаём копию, прямо инициализируя так называемым "указателем" на предыдущий объект
22:23:463 EURUSDm,H1: class A: Конструктор копии
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание, используя так называемый "указатель" на предыдущий объект
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание так называемому "указателю" значения его же самого
22:23:463 EURUSDm,H1: OnStart(): Выполняем присваивание объекту по "адресу" значения его же самого с помощью вспомогательной функции
22:23:463 EURUSDm,H1: Функция assign()
22:23:463 EURUSDm,H1: class A: Оператор присваивания
22:23:463 EURUSDm,H1: uninit reason 022:23:46 Script 3 EURUSDm,H1: removed
是的,谢谢你的关注,你是对的,在这个变体中它也不是一个单子。
关于隐式构造函数和运算符--把它们显式化并尝试使用它们,我想这是行不通的,因为你不能解除对一个对象的指针的引用。
在MQL4++中,所谓的 "指针 "似乎是隐含地被解除引用的。
该程序编译并成功运行。
看起来好像语言没有定义任何脱参,但是定义了一个从指针到引用的标准转换,在这个过程中会发生隐式脱参。assign()函数正是利用了这种特殊性。你不能不使用函数,因为看起来引用只能在函数参数中指定...
ALXIMIKS。
为什么不工作,'ptr' - 不能调用受保护的成员函数 。