//+------------------------------------------------------------------+//| Класс с конструктором по умолчанию |//+------------------------------------------------------------------+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を拭いてみましょう。Compare()です。
virtualint Compare(
CObject const * node, // элемент int mode=0// вариант
) const
すべてのコードを掲載してください。
これは、mql5のドキュメントにある例です。そのページへのリンクは こちらです。そして、以下がこのコードです。
今回の更新で、静的なクラスデータメンバの強制配置だけ でなく、静的なクラスデータメンバが導入されたようです。
が、パラメトリックコンストラクタの暗黙の呼び出しも削除されました。
明示的な呼び出しを使用する。
どのような理由で、非定数の ものを定数に変換することを取りやめたのでしょうか。
エラーや警告はなく、すべて正常にコンパイルされます。
もしエラーがあっても、それは構造上のものだけで、いずれは手に入るだろうエラーや警告を出さずにすべてコンパイルできる
A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、関数内でこの定数でないメソッドを呼び出すことは不可能になりました。
そして、今注目の問題:CObjectを拭いてみましょう。Compare()です。
O.k.これは、一定のオブジェクト・ノードを取る一定のメソッドです。ノードを不変と宣言するのは、彼の権利です。しかし、どのような根拠があって、コンペアは今、ノードの定数メソッドでしか動作しないのでしょうか?NodeはCompareのために定数メソッドを持つことを義務づけられているわけではありません。しかし、そのオブジェクトが複雑で定数メソッドを持っていないという理由だけで、標準ライブラリが意味するものをすべて使うことができないことが判明したのです!静的メンバーの配置が義務化されました。
また、静的コンストラクタが許されない場合、複雑な静的オブジェクトをどのように配置することになるのでしょうか?
A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、この定数でないメソッドは現在関数内で呼び出すことができません。
そうだ、そうでなければ、何を指定する意味がない。
代わりに
void f(A* a)
A "に定数でないメソッドが含まれていても、それ自体が定数オブジェクトとして 関数に渡される場合、この定数でないメソッドは現在関数内で呼び出すことができません。
また、静的コンストラクタが許されない場合、複雑な静的オブジェクトをどのように配置することになるのでしょうか?