Изучаем MQL5.

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Использование классов

Сообщение Рэндом » 29 авг 2013, 02:33

Прежде чем использовать класс необходимо определить переменную с типом этого класса.
Код: выделить все
Person p;

Доступ к public членам класса происходит с использованием оператора точка. Сначала пишется переменная объявленная как класс, затем точка, а затем переменная класса или функция класса.
Пример:
Код: выделить все
p.SetName("Имя");
string n=p.GetName();
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Конструкторы и деструкторы

Сообщение Рэндом » 30 авг 2013, 03:34

Конструкторы и деструкторы это специальные функции класса. Конструктор вызывается при создании объекта класса и служит для того чтобы сделать начальную инициализацию класса. Деструктор вызывается при уничтожении объекта класса и служит для того чтобы освободить выделенные ресурсы.
Конструктор может содержать параметры. Может быть определено несколько конструкторов с разными параметрами. Деструктор не содержит параметров. Конструктор и деструктор не могут возвращать значения. Конструктор и деструктор должны объявятся в секции public. Конструктор, не имеющий параметров, называется конструктором по умолчанию.
Имя конструктора соответствует имени класса.
Пример:
Код: выделить все
class CSVFile
{
     public:
         CSVFile(string name);//Открываем файл. Конструктор
         ~CSVFile();//Здесь надо закрыть открытый файл. Деструктор
}


Вызов коструктора с параметрами.
Код: выделить все
CSVFile f("g1.csv");
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Облость видимости переменных

Сообщение Рэндом » 02 сен 2013, 03:41

Выше была затронута область видимости переменных в классах. Область видимости определяет с каких и до каких пор можно использовать переменную.
Глобальные переменные могут использоваться в любом месте программы. Они определяются за пределами любой функции или класса.
Локальные переменные определяются внутри функций, как параметры функций и внутри блока кода (блок в фигурных скобках). Эти переменные доступны с момента определения и до конца блока кода. Переменные объявленные в цикле for так же считаются локальными и действуют в пределах объявленного и вложенных циклов.
Во вложенных блоках доступны переменные определенные в блоках в которые они вложены.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Операторы new и delete

Сообщение Рэндом » 03 сен 2013, 04:12

Прежде всего давайте рассмотрим ссылки на объект. Так как они тесно связаны с данными операторами.
Ссылка на объект создается так:
Код: выделить все
Person *p;

Важно понимать что это не сам объект, а ссылка на него. Изначально, после объявления, ссылка не инициализирована. Для того чтобы ее инициализировать нужно вызвать оператор new, после которого указывается конструктор. Конструктор может иметь парметры, если в классе определен конструктор с параметрами. Если в классе вообще не определен конструктор, то используется конструктор по умолчанию без параметров.
Пример:
Код: выделить все
p=new Person;

Если вы создаете объект таким способом, то для него обязательно нужно вызвать оператор delete, иначе могут быть утечки памяти.
Пример:
Код: выделить все
delete p;

Ссылки на объект могут быть полезны при создании таких типов данных как списки, стек, очередь и т.д.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Структуры

Сообщение Рэндом » 04 сен 2013, 03:26

Структуры похожи на класса за исключением того, что в них все члены открытые (public) и нельзя использовать функции.
Пример:
Код: выделить все
struct Point
{
   double X;
   double Y;
}

Использование структур:
Код: выделить все
Point p;
p.X=10.0;
p.Y=5.0;
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Передача параметров по ссылке.

Сообщение Рэндом » 04 сен 2013, 03:33

В функции можно передать параметр по ссылке. Это нужно например для передачи массивов. Параметр передоваемый по ссылке может быть изменен в функции. Поэтому еще одно очевидное использование таких параметров это несколько возвращаемых значений для функции. Для того что бы передать параметр по ссылке перед именем параметра необходимо поставить знак ампеданса &.
Пример:
void Sort(double &array[])
{
код;
}
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Перечисления.

Сообщение Рэндом » 05 сен 2013, 03:33

Перечисления - это список именованных констант.
Синтаксис перечислений:
Код: выделить все
 enum имя_перечислимого_типа
  {
   список_значений
  };

Список значений представляет собой список именованных констант разделенных запятыми. Константам можно как присвоить значения, так и нет. В последнем случае значения будут присвоены по умолчанию. Если значению не присвоено число, то нумерация начинается с 0. Значения имеют целый тип.
Пример:
Код: выделить все
enum months  // перечисление именованных констант
   {
    January,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
   };

enum intervals  // перечисление именованных констант
   {
    month=1,     // интервал в один месяц
    two_months,  // два месяца 1+1
    quarter,     // три месяца - квартал 2+1
    halfyear=6,  // полугодие
    year=12,     // год - 12 месяцев
   };
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статические переменные.

Сообщение Рэндом » 06 сен 2013, 03:23

Статические переменные сохраняют свое значение между вызовами функций. Объявляются статические переменные при помощи ключевого слова static перед типом переменной.
Статические переменные инициализируются один раз при объявлении. Если при объявлении переменная не инициализируется она принимает нулевое значение.
Пример:
Код: выделить все
void St()
{
    static int count=0;
    count++;
}

В этой функции считается количество ее вызовов.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Статические члены класса

Сообщение Рэндом » 09 сен 2013, 04:13

Члены класса могут объявятся с ключевым словом static. В этом случае они разделяются всеми экземплярами класса. И доступны не по имени переменной, а по имени класса.
Пример:
Код: выделить все
class Toy
{
  pudlic:   
       static int toys;
};

Доступ к статическому члену:
Код: выделить все
x=Toy::toys;

Функции класса тоже могут быть статическими.
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.

Наследование.

Сообщение Рэндом » 10 сен 2013, 02:38

Наследование это образование нового класса на основе существующего. При этом некоторые переменные и функции класса становятся доступными из производного.
Синтаксис:
Код: выделить все
class имя_класса :
          (public | protected | private) opt  имя_базового_класса
  {                                   
    объявления членов
  };

Наследуемый класс может наследоваться с использованием модификаторов доступа.
public. В этом случае открытые члены класса наследуются как открытые, protected как protected, и private как private.
protected. Открытые и защищенные (protected) члены класса наследуются как защищенные.
private. Все члены наследуются как private.
Конструкторы и деструкторы не наследуются.
При наследовании можно перезагружать функции, причем их заголовки могут быть абсолютно одинаковы. В этом случае если мы используем переменную производного класса, то и функция используется из производного.
Пример:
Код: выделить все
class Shape
{
     public:
         int type;
};

class Circle: public Shape
{
      public:
        double radius;
}
Аватар пользователя
Рэндом
Специалист MQL
 
Сообщений: 13700
Зарегистрирован: 18 июл 2013, 08:05
Средств на руках: 31.45 Доллар
Группа: Администраторы
Благодарил (а): 1131 раз.
Поблагодарили: 3174 раз.
Каждый заблуждается в меру своих возможностей.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения