//+------------------------------------------------------------------+//| Класс с конструктором по умолчанию |//+------------------------------------------------------------------+class CFoo
{
datetime m_call_time; // время последнего обращения к объектуpublic:
//--- конструктор с параметром, имеющем значение по умолчанию, не является конструктором по умолчанию
CFoo(constdatetime t=0){m_call_time=t;};
//--- конструктор копирования
CFoo(const CFoo &foo){m_call_time=foo.m_call_time;};
string ToString(){return(TimeToString(m_call_time,TIME_DATE|TIME_SECONDS));};
};
//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
// CFoo foo; // такой вариант использовать нельзя - конструктор по умолчанию не задан//--- допустимые варианты создания объекта CFoo
CFoo foo1(TimeCurrent()); // явный вызов параметрического конструктора
CFoo foo2(); // явный вызов параметрического конструктора с параметром по умолчанию
CFoo foo3=D'2009.09.09'; // неявный вызов параметрического конструктора
CFoo foo40(foo1); // явный вызов конструктора копирования
CFoo foo41=foo1; // неявный вызов конструктора копирования
CFoo foo5; // явный вызов конструктора по умолчанию (если конструктор по умолчанию отсутствует,// то вызывается параметрический конструктор с параметром по умолчанию)//--- допустимые варианты получения указателей CFoo
CFoo *pfoo6=new CFoo(); // динамическое создание объекта и получение указателя на него
CFoo *pfoo7=new CFoo(TimeCurrent());// ещё один вариант динамического создания объекта
CFoo *pfoo8=GetPointer(foo1); // теперь pfoo8 указывает на объект foo1
CFoo *pfoo9=pfoo7; // pfoo9 и pfoo7 указывают на один и тот же объект// CFoo foo_array[3]; // такой вариант использовать нельзя - конструктор по умолчанию не задан//--- выведем значения m_call_timePrint("foo1.m_call_time=",foo1.ToString());
Print("foo2.m_call_time=",foo2.ToString());
Print("foo3.m_call_time=",foo3.ToString());
Print("foo4.m_call_time=",foo4.ToString());
Print("foo5.m_call_time=",foo5.ToString());
Print("pfoo6.m_call_time=",pfoo6.ToString());
Print("pfoo7.m_call_time=",pfoo7.ToString());
Print("pfoo8.m_call_time=",pfoo8.ToString());
Print("pfoo9.m_call_time=",pfoo9.ToString());
//--- удалим динамически созданные объектыdelete pfoo6;
delete pfoo7;
//delete pfoo8; // удалять pfoo8 явно не нужно, так как он указывает на автоматически созданный объект foo1//delete pfoo9; // удалять pfoo9 явно не нужно, так как он указывает на тот же объект, что и pfoo7
}
如果 "A "包含一个非常量方法,但它本身是作为一个常量对象 传递给一个函数的,那么这个非常量方法现在不能在函数中被调用。
class A
{
public:
void PrintMyName(){printf("my name A");}
};
void f(const A* a)
{
a.PrintMyName(); //Хренушки. Теперь PrintMyName должен быть константым.
}
voidOnStart()
{
A a; //не const A
f(GetPointer(a));
}
现在注意问题:让我们擦拭一下CObject。比较()。
virtualint Compare(
CObject const * node, // элемент int mode=0// вариант
) const
请公布你所有的代码。
这是mql5文档中的一个例子。这里有一个 该页面的链接。而下面是这个代码。
看来,随着更新,不仅引入了静态类数据成员的强制放置。
但也删除了对参数化构造函数的隐式调用。
使用明确的调用。
他们以什么理由取消了将非常数物体 转换为常数物体的做法?
一切编译正常 - 没有错误或警告
如果有任何错误,那也只是在结构上,但他们会随着时间的推移而得到解决。所有的编译都没有错误或警告
如果 "A "包含一个非常量方法,但它本身是作为一个常量对象 传递给一个函数的,那么这个非常量方法现在不能在函数中被调用。
现在注意问题:让我们擦拭一下CObject。比较()。
O.k.这是一个常数方法,需要一个常数对象节点。这是他的权利,宣布节点是不变的。但是,在什么基础上,比较现在应该只用恒定的节点方法来工作?节点没有义务为了比较而拥有恒定的方法。但事实证明,仅仅因为该对象是复杂的,并且没有常量方法,现在他就不能使用标准库和它所意味着的一切!!。现在必须要安置静态成员。
如果不允许使用静态构造函数,你又该如何放置复杂的静态对象呢?
如果 "A "包含一个非常量方法,但它本身是作为一个常量对象 传递给函数的,那么这个非常量方法现在不能在函数中被调用。
这就对了,应该是这样的,否则指定的意义是什么?
而不是
void f(A* a)如果 "A "包含一个非常量方法,但它本身是作为一个常量对象 传递给函数的,那么这个非常量方法现在不能在函数中被调用。
如果不允许使用静态构造函数,你又该如何放置复杂的静态对象呢?