Изучаем и пишем вместе на MQL5 - страница 32

 

Ну не знаю :) у нас в конторе за написанный код типа

std::string s = "";

как минимум пожурят, и имхо, правильно сделают.

Повторюсь -- это сложный тип, требующий корректной инициализации при создании, если строку надо инициализировать -- это бага МТ5(4), однозначно.

Может еще размер массивов надо обнулять сразу после создания???

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
TheXpert:

Ну не знаю :) у нас в конторе за написанный код типа

как минимум пожурят, и имхо, правильно сделают.

Прежде чем использовать переменную, ей необходимо присвоить значение (явно инициализировать). Или Вы не согласны?

Явная инициализация не подразумевает необходимость таковой непосредственно в момент ее объявления. Но если потом значение неинициализированной переменной будет использовано в каких-то вычислениях, то последствия непредсказуемы.

 

Вы меня пугаете, Рашид, при всем уважении.

У класса есть конструктор, в котором происходит начальная инициализация объекта и в том числе задание дефолтного значения, если это логично.

Если начальной инициализации не происходит, должен быть способ узнать, в адекватном ли состоянии находится объект. Со строкой гораздо более логично задание дефолного значения.

std::string s = "";

такая запись -- это паранойя, параноик априори не может писать нормальный код.

Так строки не инициализируются??

 
TheXpert:
Так строки не инициализируются??
Конечно инициализируются, но не в пустую строку "", а в NULL.
 
TheXpert:

Вы меня пугаете, Рашид, при всем уважении.

У класса есть конструктор, в котором происходит начальная инициализация объекта и в том числе задание дефолтного значения, если это логично.

Если начальной инициализации не происходит, должен быть способ узнать, в адекватном ли состоянии находится объект. Со строкой гораздо более логично задание дефолного значения.

такая запись -- это паранойя, параноик априори не может писать нормальный код.

Так строки не инициализируются??

Читайте справку - https://www.mql5.com/ru/docs/basis/types/classes:

Если структура содержит переменные типа string и/или объект динамического массива, то компилятор назначает для такой структуры неявный конструктор, в котором производится обнуление всех членов структуры типа string и правильная инициализация для объекта динамического массива.

...

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

Конструктор - это специальная функция, которая вызывается автоматически при создании объекта структуры или класса и обычно используется для инициализации членов класса. Далее мы будем говорить только о классах, при этом все сказанное относится и к структурам, если не оговорено иное. Имя конструктора должно совпадать с именем класса. Конструктор не имеет возвращаемого типа (можно указать тип void).

Определенные члены класса – строки, динамические массивы и объекты, требующие инициализации – в любом случае будут проинициализированы, независимо от наличия конструктора.

Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 

Жесть... Ну хотя бы знать буду.

А в структурах она тоже NULL будет?

 
TheXpert:

Жесть... Ну хотя бы знать буду.

А в структурах она тоже NULL будет?

Просто сравните на NULL и все узнаете сами - Тип void и константа NULL:

Предопределенная константная переменная NULL имеет тип void. Она может быть присвоена переменным любых других фундаментальных типов без преобразования. Также допускается сравнение переменных фундаментальных типов со значением NULL

Пример:

//--- если строка не инициализирована, то присвоим ей наше предопределенное значение
if(some_string==NULL) some_string="empty";

Также NULL можно сравнивать с указателями на объекты, созданные при помощи оператора new.

 
Rosh:

Прежде чем использовать переменную, ей необходимо присвоить значение (явно инициализировать). Или Вы не согласны?

Явная инициализация не подразумевает необходимость таковой непосредственно в момент ее объявления. Но если потом значение неинициализированной переменной будет использовано в каких-то вычислениях, то последствия непредсказуемы.

Кстати о птичках.

//Struct StrMQL4_Deal
struct StrMQL4_Deal
{
//----------------------------------------------------------------------------//
double TP = 0;
double SL = 0;
//----------------------------------------------------------------------------//
};

И что нам на это ответит компилятор. А ответит от он следующее - '=' - illegal assignment use

//Class CMqlExpert
class CMqlExpert
//Purpose: Main class of trade system. 
{
//----------------------------------------------------------------------------//
protected:
//****************************************************************************//
//                    Protected declarations of the class                     //
//****************************************************************************//
bool TradeMonday    = true; //Trade in monday
bool TradeTuesday   = true; //Trade in tuesday
bool TradeWednesday = true; //Trade in wednesday
bool TradeThursday  = true; //Trade in thursday
bool TradeFriday    = true; //Trade in friday
//----------------------------------------------------------------------------//
public:

Компилятор был не преклонен - '=' - illegal assignment use.

У меня вопрос - А что будет если программер (в данном случае я) не позаботится об инициализации переменных до их использования (поступив так как того требует компилятор и упустив этот момент в конструкторе)?


 
Interesting:

У меня вопрос - А что будет если программер (в данном случае я) не позаботится об инициализации переменных до их использования (поступив так как того требует компилятор и упустив этот момент в конструкторе)?

вопрос звучит от какого то новичка...
 
sergeev:
вопрос звучит от какого то новичка...

Ну так я примерно и подумал в свое время (Давно это было, вот припомнилось), а ведь хотел с горяча заявку писать. :)

Хотя до сих пор не пойму почему на уровне компилятора запрещено сразу инициализировать переменные.