在MQL5中一起学习和写作 - 页 32

 

我不知道:)在我们的办公室,对于书面的代码如

std::string s = "";

至少,他们会被责骂,而且是正确的,我认为。

同样,这是一个复杂的类型,需要在创建时进行正确的初始化,如果字符串需要被初始化--这肯定是MT5(4)的一个错误。

也许数组的大小应该在创建后立即被清零?

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

我不知道 :) 在我们公司,他们会因为写了这样的代码而被罚款。

至少,你会被训斥,而且我认为是正确的。

在你使用一个变量之前,你必须给它赋值(明确地初始化它)。或者你不同意吗?

明确的初始化并不意味着在声明的时候需要初始化。但是,如果未初始化的变量的值随后被用于某些计算,其后果是不可预测的。

 

你吓到我了,拉希德,恕我直言。

一个类有一个构造函数,它执行对象的初始化,包括设置默认值,如果它是符合逻辑的。

如果初始化没有发生,必须有一种方法来知道对象是否处于适当的状态。对于一个字符串来说,设置一个默认值要合理得多。

std::string s = "";

这样的记号是偏执的,一个偏执的人不能先验地写出正常的代码。

所以字符串没有被初始化?

 
TheXpert:
那么,字符串没有被初始化?
当然,它们被初始化了,但不是初始化为空字符串"",而是初始化为NULL。
 
TheXpert:

你吓到我了,拉希德,恕我直言。

一个类有一个构造函数,这是对对象进行初始化的地方,包括设置一个默认值,如果这符合逻辑的话。

如果初始化没有发生,必须有一种方法来知道对象是否处于适当的状态。对于一个字符串来说,设置一个默认值要合理得多。

这样的记号是偏执的,一个偏执的人不能先验地写出正常的代码。

所以字符串没有被初始化?

阅读帮助 -https://www.mql5.com/ru/docs/basis/types/classes。

如果一个结构包含字符串 类型的变量和/或动态数组对象 ,编译器会给这样的结构分配一个隐含的构造函数,其中字符串类型结构的所有成员都被清零 ,并且对动态数组对象进行了正确的初始化

...

构造函数和析构函数

构造函数是在创建结构对象或类时自动调用的一个特殊函数,通常用于初始化 类成员。在下面的讨论中,我们只谈类,上述内容也适用于结构,除非另有说明。构造函数的名称必须与类的名称相一致。构造函数没有返回类型(你可以指定void 类型)。

某些类成员--字符串动态数 组和需要初始化的对象--无论如何都会被初始化,不管是否存在构造函数。

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

这真令人沮丧...至少我可以知道。

它在结构上也会是NULL吗?

 
TheXpert:

这真令人失望...好吧,至少我会知道。

它在结构上也会是NULL吗?

只要与NULL进行比较,你就会自己知道所有的事情 -Type void和常数NULL

预定义的常量变量 NULL无效 类型 。 它可以被分配给任何其他基本类型的变量,而无需转换 它也允许将基本类型 的变量与NULL进行比较

例子。

//---- 如果一个字符串没有被初始化,就给它分配我们的预定义值
如果(some_string==NULL) some_string="空"

NULL 可以与使用new操作符 创建的对象的指针进行比较。

 
Rosh:

在使用一个变量之前,必须分配一个值(明确初始化)。或者你不同意吗?

明确的初始化并不意味着在声明变量的时候需要初始化。但是,如果一个未初始化的变量的值随后被用于一些计算中,其后果是不可预测的。

说到鸟类。

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

而编译器将如何回应?并将回答以下问题 '=' - 非法使用赋值

//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:

编译器并没有弯曲 - '=' - 非法使用赋值。

我的问题是--如果程序员(在这种情况下,我)在使用变量之前不对其进行初始化(他按照编译器要求的方式进行,在构造函数中省略了这一时刻),会发生什么?


 
Interesting:

我有一个问题--如果程序员(在这种情况下是我)在使用变量之前没有注意初始化这些变量(按照编译器的要求做,而在构造函数中错过了这一点),会发生什么?

这个问题来自于一些新手...
 
sergeev:
听起来像是某个新来者的问题...

好吧,这是我当时的想法(那是很久以前的事了,我想起来了),但我想在关键时刻写一份申请。:)

虽然我还是不明白为什么禁止在编译器层面初始化变量。