Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 215

 

Übrigens, wenn wir ein statisches Array X x[n] erstellen und X einen k-Tor hat, dann werden alle Elementfelder darin zuerst auf Null gesetzt, auch die privaten, und erst dann wird der k-Tor aufgerufen. Es ist also kein Verstoß gegen das OOP-Paradigma, private Felder auf Null zu setzen.

Aber die Tatsache, dass der Konstruktor nicht funktioniert hat, ist ein Fehler.

 
mktr8591 #:

Übrigens, wenn Sie ein statisches Array X x[n] objektieren; und X hat einen k-tor, dann werden alle Elementfelder darin zuerst auf Null gesetzt, auch private, und erst dann wird der k-tor aufgerufen. Es ist also kein Verstoß gegen das OOP-Paradigma, private Felder auf Null zu setzen.

Das ist großartig. Es stellt sich also heraus, dass die Nullstellung VOR dem Konstruktor erfolgt und somit alles korrekt ist. Ich danke Ihnen!

 
Igor Makanu #:

Ich habe mir meine Forschung in MQL5 angesehen, es könnte schlimmer sein, ich pumpe sogar die Geschichte im Indikator um mehrere TFs auf:

Ich kann eine Menge Dinge in eine for-Anweisung schreiben ))))

Mir ist noch nie ein Aufruf einer ungültigen Funktion in einer for-Anweisung begegnet. Ich habe schon oft andere Varianten gesehen.

 
mktr8591 #:
Ich vergaß hinzuzufügen, wenn eine Klasse nicht-triviale Felder (Objekte) hat, dann wird nach dem Zero-Init des gesamten Objekts für solche Felder ihr Standard-C-Tor aufgerufen.

Lesen:

Die Auswirkungen der Wertinitialisierung sind:

1)Wenn T ein Klassentyp ohneStandardkonstruktor oder mit einem vom Benutzer bereitgestellten oder gelöschtenStandardkonstruktor ist, wird das Objektstandardmäßig initialisiert;
2) Wenn T ein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (d. h. es kann sich um eine Klasse mit einem implizit definierten oder voreingestellten Standardkonstruktor handeln), wird das Objektnull-initialisiert, und die semantischen Einschränkungen für die Standardinitialisierung werden überprüft; wenn T einen nicht-trivialen Standardkonstruktor hat, wird das Objektstandardinitialisiert;
3)Wenn T ein Array-Typ ist, wird jedes Element des Arrays mit einem Wert initialisiert;
4) Andernfalls wird das Objektnull-initialisiert.


Lesen Sie über default-initialized:

  • wenn T ein (möglicherweise cv-qualifizierter)Nicht-POD-Klassentyp(bis C++11) ist, werden die Konstruktoren berücksichtigt und einer Überladungsauflösung gegen die leere Argumentliste unterzogen. Der ausgewählte Konstruktor (der einer derStandardkonstruktoren ist) wird aufgerufen, um den Anfangswert für das neue Objekt bereitzustellen;
  • wenn T ein Array-Typ ist, wird jedes Element des Arrays standardmäßig initialisiert;
  • Andernfalls wird keine Initialisierung durchgeführt: Die Objekte mit automatischer Speicherdauer (und ihre Unterobjekte) enthalten unbestimmte Werte.

UB!

Die Tatsache, dass der Compiler Sie mit Nullen initialisiert, hat nichts zu bedeuten, heute initialisiert er, und morgen, nach dem nächsten Update....

 
Vladimir Simakov #:

Lesen:

Die Auswirkungen der Wertinitialisierung sind:

1)Wenn T ein Klassentyp ohneStandardkonstruktor oder mit einem vom Benutzer bereitgestellten oder gelöschtenStandardkonstruktor ist, wird das Objektstandardinitialisiert;
2) Wenn T ein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (d. h. es kann sich um eine Klasse mit einem implizit definierten oder voreingestellten Standardkonstruktor handeln), wird das Objektnull-initialisiert, und die semantischen Einschränkungen für die Standardinitialisierung werden überprüft; wenn T einen nicht-trivialen Standardkonstruktor hat, wird das Objektstandardinitialisiert;
3)Wenn T ein Array-Typ ist, wird jedes Element des Arrays mit einem Wert initialisiert;
4) Andernfalls wird das Objektnull-initialisiert.


Lesen Sie über default-initialized:

  • wenn T ein (möglicherweise cv-qualifizierter)Nicht-POD-Klassentyp(bis C++11) ist, werden die Konstruktoren berücksichtigt und einer Überladungsauflösung gegen die leere Argumentliste unterzogen. Der ausgewählte Konstruktor (der einer derStandardkonstruktoren ist) wird aufgerufen, um den Anfangswert für das neue Objekt bereitzustellen;
  • wenn T ein Array-Typ ist, wird jedes Element des Arrays standardmäßig initialisiert;
  • Andernfalls wird keine Initialisierung durchgeführt: Die Objekte mit automatischer Speicherdauer (und ihre Unterobjekte) enthalten unbestimmte Werte.

UB!

Die Tatsache, dass der Compiler Sie mit Nullen initialisiert, hat nichts zu bedeuten, heute initialisiert er, und morgen, nach dem nächsten Update....

Mein Beitrag "Vergessen zu addieren...." wurde als Ergänzung zum vorherigen Beitrag geschrieben:

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Eigenheiten der Sprache mql5, Tipps und Tricks

mktr8591, 2021.11.18 18:15

@A100




Wenn Sie sich daran erinnern, dass mql aus C++ hervorgegangen ist, funktionieren diese beiden Beispiele (ihre Gegenstücke) gut, weil es in diesen Klassen keine Konstruktoren gibt (d.h. es gibt einen impliziten Konstruktor):

  • Die Deklaration von ClassX x[n]={}; führt zu einer Wertinitialisierung für jedes Element des Arrays.
  • Wenn ClassX keine benutzerdefinierten Konstruktoren hat (aber einen standardmäßigen Konstruktor, der nicht gesetzt ist), dann wird die Null-Initialisierung der Klassenobjekte durchgeführt - unabhängig davon, ob es private Felder gibt.
  • Aber wenn es Konst-Felder gibt, wird der Standard-Ktor implizit gelöscht, also Compiler-Fehler.

Beispiel in 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;
}

Wenn also keine Konstantenfelder in der Struktur/Klasse vorhanden sind, ist die Logik korrekt.


Es wurde eine bestimmte Situation berücksichtigt - wenn eine Klasse keine Benutzerkonstruktoren hat und es einen impliziten Konstruktor gibt, der nicht gelöscht wird. In diesem Fall ist der von Ihnen zitierte Punkt 1 nicht angemessen.

Punkt"2) Wenn T ein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (d. h. es kann sich um eine Klasse mit einem implizit definierten oder vorgegebenen Standardkonstruktor handeln), ist das Objektnull-initialisiert und die semantischen Einschränkungen für die Standard-Initialisierung werden überprüft, und wenn T einen nicht-trivialen Standard-Konstruktor hat, ist das Objektstandard-initialisiert;".


Es passt also alles zusammen.

 
Vladimir Simakov #:

Lesen:

Die Auswirkungen der Wertinitialisierung sind:

1)Wenn T ein Klassentyp ohneStandardkonstruktor oder mit einem vom Benutzer bereitgestellten oder gelöschtenStandardkonstruktor ist, wird das Objektstandardinitialisiert;
2) Wenn T ein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (d. h. es kann sich um eine Klasse mit einem implizit definierten oder voreingestellten Standardkonstruktor handeln), wird das Objektnull-initialisiert, und die semantischen Einschränkungen für die Standardinitialisierung werden überprüft; wenn T einen nicht-trivialen Standardkonstruktor hat, wird das Objektstandardinitialisiert;
3)Wenn T ein Array-Typ ist, wird jedes Element des Arrays mit einem Wert initialisiert;
4) Andernfalls wird das Objektnull-initialisiert.


Lesen Sie über default-initialized:

  • wenn T ein (möglicherweise cv-qualifizierter)Nicht-POD-Klassentyp(bis C++11) ist, werden die Konstruktoren berücksichtigt und einer Überladungsauflösung gegen die leere Argumentliste unterzogen. Der ausgewählte Konstruktor (der einer derStandardkonstruktoren ist) wird aufgerufen, um den Anfangswert für das neue Objekt bereitzustellen;
  • wenn T ein Array-Typ ist, wird jedes Element des Arrays standardmäßig initialisiert;
  • Andernfalls wird keine Initialisierung durchgeführt: Die Objekte mit automatischer Speicherdauer (und ihre Unterobjekte) enthalten unbestimmte Werte.

UB!

Die Tatsache, dass der Compiler Sie mit Nullen initialisiert, hat nichts zu bedeuten, heute initialisiert er, und morgen, nach dem nächsten Update....

Ups, falsch gelesen. In diesem Fall:

2) Wenn Tein Klassentyp mit einem Standardkonstruktor ist, der weder vom Benutzer bereitgestellt noch gelöscht wird (d. h. es kann sich um eine Klasse mit einem implizit definierten oder vorgegebenen Standardkonstruktor handeln), istdas Objektnull-initialisiertund die semantischen Einschränkungen für die Standard-Initialisierung werden überprüft, und wenn Teinen nicht-trivialen Standard-Konstruktor hat, istdas Objektstandard-initialisiert;
 
fxsaber #:

Großartig. Es stellt sich heraus, dass die Nullstellung VOR dem Konstruktor kommt, also ist alles korrekt. Ich danke Ihnen!

Nur für den Fall - dies ist nur für statische (dies ist alles über C + +). Bei lokalen Variablen gibt es keine Nullstellung, wenn ein benutzerdefinierter k-tor vorhanden ist.
 
fxsaber #:

Ich habe noch keinen Aufruf einer ungültigen Funktion in einer for-Anweisung gesehen. Die anderen Varianten sind recht häufig.

Sie können in den 3. Parameter der for-Anweisung schreiben, was Sie wollen. Tatsächlich kann die for-Anweisung die if()-Anweisung durch {.....} ersetzen.

SZZ: Ich habe auch Makros gesehen wie

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

Sie können in den 3. Parameter der for-Anweisung schreiben, was Sie wollen, die for-Anweisung kann sogar die if()-Anweisung durch {.....} ersetzen.

SZZ: Ich habe auch Makros gesehen wie

Nehmen Sie das Semikolon weg, sonst geht der ganze Sinn verloren)))

 
Vladimir Simakov #:

Entfernen Sie das Semikolon, da sonst alle Bedeutung verloren geht))))

ja, richtig - dieses Beispiel in Makros zu setzen ; beim Aufruf eines Makros, ich weiß nicht verwenden Makros viel - keine Praxis

Grund der Beschwerde: