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のバグは一度も修正されていないhttps://www.mql5.com/ru/forum/1111/page2451#comment_11556395

"私の専門用語 "は、尋ねること、文句を言わないことです。

しかし,デフォルトの演算子 = を使う意味は,構造体のフィールドだけを記述するのに便利で,配列の次元も含めてすべてがコピーされることです(ただし,次元が増えるだけです - 動作原理は ArrayCopy() と同じです).


まあ、バグならここまでしないとね。

 

という質問は、純粋に理論的なものです。

は、おそらく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;
  }

そして、そもそも何が言いたいのか?