MQL5中的OOP问题 - 页 44

 
Igor Makanu:

我不同意。

请更新你的知识,了解什么是 "赋值运算符 "和 "复制构造器",它们有什么不同,何时以及如何调用它们(显式和隐式)。
在代码中,你用黄色标出了一个局部变量从一个函数中的返回,其结果是调用默认的复制构造器(不要与赋值运算符混淆)。

不幸的是,什么是 "完整的数据类型 "并不完全清楚,也不清楚你想用你的代码来证明什么......。
我再重复一遍:"默认MQL赋值运算符返回void;"

struct A{
   int x,y;
};

void OnStart(){
   A a, b;
   Print(typename(a = b));   // void
}
 
Koldun Zloy:

错了。

只要定义你的operator=,返回这个,就能看到区别。

当赋值的结果再次被分配时,你可以看到差异。

如果我定义operator=,我就偏离了我最初的目标,即调用默认的::=。

这似乎是一个无法解决的问题。


谢尔盖-迪尤布利 克。

不幸的是,什么是 "完整的数据类型 "并不十分清楚,也不清楚你想用你的代码来证明什么...

full是完整的--数据结构 将被保留,如果我增加新的字段,就不需要控制结构的复制了

 
Igor Makanu:

如果我定义运算符=,我就偏离了我最初的目标,即调用默认的::=。

你真的需要这样的任务吗?

b = c = a;
 
Igor Makanu:

complete是完整的--数据结构 将被保留,如果增加了新的字段,就不需要控制结构的复制了

然后,根据你的术语,调用默认赋值运算符可以得到一个 "不完整的数据类型"。
2019.05.03的错误从未被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395

 
Koldun Zloy:

你真的需要这样一项任务吗?

纯粹从理论上讲,我想知道它是否是一个 "新实体",而不是一个运算符= =。

我根本不需要它的实际用途,我把它放在2个运营商中没有问题。


谢尔盖-迪尤布利 克。

然后,根据你的术语,调用默认赋值运算符可以得到 "不完整的数据类型"。
2019.05.03的bug一直没有被修复:https://www.mql5.com/ru/forum/1111/page2451#comment_11556395

"我的术语 "是问,没有投诉。

但使用默认操作符=的意义在于,只描述结构中的字段是很方便的,所有东西都被复制了,甚至包括数组的尺寸(尽管只是尺寸增加--工作原理与ArrayCopy()相同)。


好吧,如果它是一个bug,它一定是到目前为止。

 

这个问题纯粹是理论性的。

可能在SB中看到过这样的构造器调用。

class A{
public:   
   A(){Print(__FUNCTION__);}
};

class B{
public:   
   A a1,a2;
   B():a1(),a2() { Print(__FUNCTION__); }   
};

这个代码会有什么不同。

class A{
public:   
   A(){Print(__FUNCTION__);}
};

class B{
public:   
   A a1,a2;
   B() { Print(__FUNCTION__); }   
};

我已经解压了,我没有看到任何区别,那么请具体一点--什么或者为什么我们可以对a1和a2对象使用强制构造函数调用?

第一个选项的 "便利 "是什么?

 
Igor Makanu:

这个问题纯粹是理论性的。

可能在SB中看到过这样的构造器调用。

这个代码会有什么不同。

我已经解压了,我没有看到任何区别,那么具体一点--有什么好处或者为什么我们可以对对象a1和a2使用强制构造函数调用?

第一个选项的 "便利 "是什么?

构造函数可以有参数,它们必须以某种方式被传递。

也就是说,在没有参数之前,没有任何区别,但如果你使用构造函数A(int arg),那就不一样了

 
Maxim Kuznetsov:

构造函数有参数,它们必须以某种方式被传递。

也就是说,在没有参数之前,区别不大。 但如果你有构造函数A(int arg),那就不一样了

你可能是对的--这取决于目的。

我只是在第一个变体上遇到了困难,当时我想使用B类的 2个构造函数,在两个构造函数中都收到了重复的代码--我把它们删除了,得到的只是第一个变体中的一部分代码,问题出现了,我在哪里看到了它,为什么我这样写)))。

 
Igor Makanu:

是什么原因使对象a1和a2的构造函数可以被强制使用?

正确的过程名称不是 "强制构造函数调用a1和a2",而是类(非静态)字段的初始化。
在以下情况下,必须要有。

- 使用常数类字段。
- 没有为类字段提供默认的构造函数。
- 除了通过构造函数调用外,没有任何其他初始化对象的方式(例如,删除赋值运算符)。
-...

 

谁能解释一下,这种初始化字段的方式比这个好吗?

CArray::CArray(void) : m_step_resize(16),
                       m_data_total(0),
                       m_data_max(0),
                       m_sort_mode(-1)
  {
  }

是比这更好的。

CArray::CArray(void)
  {
        m_step_resize=16;
        m_data_total=0;
        m_data_max=0;
        m_sort_mode=-1;
  }

那到底有什么意义呢?