Основы языка
© 2000-2011, MetaQuotes Software Corp.
71
инициализироваться согласно порядку их объявления. Это означает, что в третьем конструкторе
сначала будет инициализирован член m_first_name, так как он объявлен первым, и только после
него будет инициализирован член m_second_name. Это необходимо учитывать в тех случаях,
когда инициализация одних членов класса зависит от значений в других членах класса.
Если в базовом классе не объявлен конструктор по умолчанию и при этом объявлен один или
несколько конструкторов с параметрами, то нужно обязательно вызвать один из конструкторов
базового класса в списке инициализации. Он идет через запятую как обычные члены списка и
будет вызван в первую очередь при инициализации объекта независимо от местоположения в
списке инициализации.
//+------------------------------------------------------------------+
//| базовый класс |
//+------------------------------------------------------------------+
class CFoo
{
string m_name;
public:
//--- конструктор со списком инициализации
CFoo(string name) : m_name(name) { Print(m_name);}
};
//+------------------------------------------------------------------+
//| потомок класса CFoo |
//+------------------------------------------------------------------+
class CBar : CFoo
{
CFoo m_member; // член класса является объектом предка
public:
//--- конструктор по умолчанию в списке инициализации вызывает конструктор предка
CBar(): m_member(_Symbol), CFoo("CBAR") {Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
CBar bar;
}
В приведенном примере при создании объекта bar будет вызван конструктор по умолчанию CBar(),
в котором сначала вызывается конструктор для предка CFoo, а затем конструктор для члена
класса m_member.
Деструктор - это специальная функция, которая вызывается автоматически при уничтожении
объекта класса. Имя деструктора записывается как имя класса с тильдой (~). Строки,
динамические массивы и объекты, требующие деинициализации, в любом случае будут
деинициализированы независимо от наличия деструктора. При наличии деструктора, эти действия
будут произведены после вызова деструктора.
Деструкторы всегда являются виртуальными, независимо от того, объявлены они с ключевым