mql5言語の特徴、微妙なニュアンスとテクニック - ページ 215

 

ところで、配列 static X x[n]; を作成し、X が k-tor を持つ場合、その中のすべての要素フィールドは private でもまずゼロにされ、その後初めて k-tor が呼び出されます。ですから、プライベートフィールドをゼロにすることは、OOPパラダイムに違反するものではありません。

しかし、コンストラクタが動作しなかったのはバグです。

 
mktr8591 #:

ところで、静的配列X x[n]; をオブジェクトとし、Xがk-torを持つ場合、その中の全ての要素フィールドはprivateでもまずゼロにされ、その後初めてk-torが呼ばれる。ですから、プライベートフィールドをゼロにすることは、OOPパラダイムに違反するものではありません。

それは素晴らしいことです。つまり、ゼロ化はコンストラクタの前に来るので、すべてが正しいということがわかりました。ありがとうございました。

 
Igor Makanu #:

MQL5で調べたところ、もっと悪いかもしれない、インジケーターのヒストリーを数TF分汲み上げることもしています。

for文でいろいろと書ける )))

for文でvoid-functionの呼び出しに遭遇したことはない。他のバリエーションもよく見かけるようになりました。

 
mktr8591 #:
付け加えると、もしクラスが自明でないフィールド(オブジェクト)を持っているなら、そのようなフィールドのためにオブジェクト全体をゼロ・イニットした後、そのデフォルトのc-torが呼び出されることになります。

読んでみてください。

値の初期化の効果は

1)T がデフォルトコンストラクタを 持たないクラス型、またはユーザが提供または削除したデフォルトコンストラクタを 持つ場合、オブジェクトはデフォルトで初期化さ れる。
2) T がユーザ提供でも削除でもないデフォルトコンストラクタを持つクラス型である場合(つまり、暗黙的に定義されたデフォルトコンストラクタやデフォルトされたデフォルトコンストラクタを持つクラスでもよい)、オブジェクトはゼロ初期化 されてデフォルト初期化の意味制約がチェックされ、T に非自明なデフォルトコンストラクタがあればオブジェクトがデフォルト初期化さ れます。
3)T が配列型の場合,配列の各要素は値で初期化さ れる。
4) それ以外の場合、オブジェクトはゼロ初期化さ れる。


default-initializedについてお読みください。

  • T が(cv で修飾された POD(C++11 まで クラス型である場合,コンストラクタは空の引数リストに対して過負荷解消が 行われるものと見なされます.選択されたコンストラクタ(デフォルトコンストラクタの 1つ)が呼び出され、新しいオブジェクトの初期値が提供されます
  • T が配列型の場合,配列の各要素はデフォルトで初期化される。
  • そうでない場合は、初期化は行われません:自動保存期間を持つオブジェクト(およびそのサブオブジェクト)は、不定な値を含んでいます。

UB!

コンパイラがゼロで初期化しても、今日は初期化、明日は次のアップデート後...と、何の意味もないんです。

 
Vladimir Simakov #:

読んでみてください。

値の初期化の効果は

1)T がデフォルトコンストラクタを 持たないクラス型、またはユーザが提供または削除したデフォルトコンストラクタを 持つ場合、オブジェクトはデフォルトで初期化さ れる。
2) T がユーザ提供でも削除でもないデフォルトコンストラクタを持つクラス型である場合(つまり、暗黙的に定義されたデフォルトコンストラクタやデフォルトされたデフォルトコンストラクタを持つクラスでもよい)、オブジェクトはゼロ初期化 されてデフォルト初期化の意味制約がチェックされ、T に非自明なデフォルトコンストラクタがあればオブジェクトはデフォルト初期化さ れます。
3)T が配列型の場合,配列の各要素は値で初期化さ れる。
4) それ以外の場合、オブジェクトはゼロ初期化さ れる。


default-initializedについてお読みください。

  • T が(cv で修飾された POD(C++11 まで クラス型である場合,コンストラクタは空の引数リストに対して過負荷解消が 行われるものと見なされます.選択されたコンストラクタ(デフォルトコンストラクタの 1つ)が呼び出され、新しいオブジェクトの初期値が提供されます
  • T が配列型の場合,配列の各要素はデフォルトで初期化される.
  • そうでない場合は、初期化は行われません:自動保存期間を持つオブジェクト(およびそのサブオブジェクト)は、不定な値を含んでいます。

UB!

コンパイラがゼロで初期化することに意味はなく、今日は初期化、明日は次のアップデート後......という具合です。

私の投稿「付け忘れ......」は、前回の投稿の補足として書かれたものです。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特殊性、ヒントとコツ

mktr8591, 2021.11.18 18:15

@A100




mqlがC++から生まれたことを思い出せば、これらのクラスにはコンストラクタがない(つまり暗黙のコンストラクタがある)ので、これらの例(の対応)は両方ともそこそこうまく動作します。

  • ClassX x[n]={}; と宣言すると、配列の各要素に値が初期化 されます。
  • ClassX にカスタムコンストラクタがない場合(ただし、デフォルトの未設定コンストラクタはある)、クラスオブジェクトのゼロ初期化が行われます - プライベートフィールドがあるかどうかに関係なく、です。
  • しかし、constフィールドがある場合、デフォルトコンストラクタが暗黙のうちに削除されるため、コンパイラエラーとなります。

C++での例。

#include <iostream>
using namespace std;

class X
{
    int a;
    public:
    int get(){return a;}

    //X(){}   //так массив x не обнуляется
    //а если нет конструктора - то обнуляется
};

int main()
{
    X x[10]={};
    for (int i=0; i<10;i++)   cout<<x[i].get()<<endl;
}

したがって、構造体/クラスにconstフィールドがなければ、このロジックは正しいことになります。


それは、あるクラスがユーザーコンストラクタを持たず、削除されない暗黙のコンストラクタがある場合という状況に対処するものでした。この場合、あなたが引用したポイント1は適切ではありません。

ポイント「2 Tがユーザ提供でも削除でもないデフォルトコンストラクタを持つクラス型である場合(つまり、暗黙的に定義されたデフォルトコンストラクタを持つクラスであってもよい)、オブジェクトはゼロ初期化さ れ、デフォルト初期化に関するセマンティック制約がチェックされ、Tが自明でないデフォルトコンストラクタを持つ場合オブジェクトはデフォルト初期化さ れる;".


だから、すべてがうまくいくのです。

 
Vladimir Simakov #:

読んでみてください。

値の初期化の効果は

1)T がデフォルトコンストラクタを 持たないクラス型、またはユーザが提供または削除したデフォルトコンストラクタを 持つ場合、オブジェクトはデフォルトで初期化さ れる。
2) T がユーザ提供でも削除でもないデフォルトコンストラクタを持つクラス型である場合(つまり、暗黙的に定義されたデフォルトコンストラクタやデフォルトされたデフォルトコンストラクタを持つクラスでもよい)、オブジェクトはゼロ初期化 されてデフォルト初期化の意味制約がチェックされ、T に非自明なデフォルトコンストラクタがあればオブジェクトはデフォルト初期化さ れます。
3)T が配列型の場合,配列の各要素は値で初期化さ れる。
4) それ以外の場合、オブジェクトはゼロ初期化さ れる。


default-initializedについてお読みください。

  • T が(cv で修飾された POD(C++11 まで クラス型である場合,コンストラクタは空の引数リストに対して過負荷解消が 行われるものと見なされます.選択されたコンストラクタ(デフォルトコンストラクタの 1つ)が呼び出され、新しいオブジェクトの初期値が提供されます
  • T が配列型の場合,配列の各要素はデフォルトで初期化される.
  • そうでない場合は、初期化は行われません:自動保存期間を持つオブジェクト(およびそのサブオブジェクト)は、不定な値を含んでいます。

UB!

コンパイラがゼロで初期化しても、今日は初期化、明日は次のアップデート後......と、何の意味もないんです。

おっと、読み違えた。この場合

2) Tがユーザ提供でも削除でもないデフォルトコンストラクタを持つクラス型 である場合(つまり、暗黙的に定義されたデフォルトコンストラクタを持つクラスであってもよい)、オブジェクトは 次のようになります。ゼロ初期化され、デフォルト初期化に関するセマンティック制約がチェック され、Tが自明でないデフォルトコンストラクタを持つ場合、オブジェクトはデフォルト初期化されます
 
fxsaber #:

素晴らしい。ゼロにするのはコンストラクタの前であることがわかり、すべてが正しいことがわかりました。ありがとうございました。

念のため - これは静的なものだけです(これはC++のすべてについてです)。ローカル変数の場合、カスタムk-torがあれば、ゼロイングはありません。
 
fxsaber #:

for文の中でvoid関数呼び出しは見たことない。その他のバリエーションはごく一般的なものです。

for文の第3パラメータには何でも書けます。実際、for文はif()文の代わりに{......}と書くことができます。

SZZ:のようなマクロも見たことがあります。

do
{
.....
}while(0)
 
Igor Makanu #:

for文の第3パラメータには何でも書ける。実際、for文はif()文の代わりに{......}と書くことができる。

SZZ:のようなマクロも見たことがあります。

セミコロンを取っ払わないと意味がない))

 
Vladimir Simakov #:

セミコロンを削除すると、すべての意味が失われます)))

そうそう、このマクロの例では、マクロを呼び出すときに;を置くために、私はあまりマクロを使用していない - 練習はありません。