Caractéristiques du langage mql5, subtilités et techniques - page 215

 

À propos, si vous avez pour objet un tableau statique X x[n] ; et que X a un k-tor, alors tous les champs d'éléments dans ce tableau seront d'abord mis à zéro, même les champs privés, et seulement ensuite le k-tor sera appelé. Il n'y a donc aucune violation du paradigme de la POO dans la mise à zéro des champs privés.

Mais le fait que le constructeur ne fonctionne pas est un bug.

 
mktr8591 #:

À propos, si nous créons un tableau static X x[n] ; et que X a un k-tor, alors tous les champs d'éléments dans ce tableau sont d'abord mis à zéro, même les champs privés, et seulement ensuite le k-tor est appelé. Il n'y a donc aucune violation du paradigme de la POO dans la mise à zéro des champs privés.

C'est génial. Il s'avère donc que la mise à zéro intervient AVANT le constructeur, et que tout est donc correct. Merci !

 
Igor Makanu #:

J'ai regardé mes recherches dans MQL5, ça pourrait être pire, j'ai même gonflé l'historique dans l'indicateur de plusieurs TF :

Je peux écrire beaucoup de choses dans une instruction for )))).

Je n'ai jamais rencontré d'appel à une fonction vide dans une déclaration for. J'ai vu d'autres variantes assez souvent.

 
mktr8591 #:
J'ai oublié d'ajouter que si une classe a des champs (objets) non triviaux, alors après l'initialisation de l'ensemble de l'objet pour ces champs, leur c-tor par défaut sera appelé.

Lisez :

Les effets de l'initialisation des valeurs sont :

1)si T est un type de classe sansconstructeur par défaut ou avec unconstructeur par défaut fourni par l'utilisateur ou supprimé, l'objet estinitialisé par défaut;
2) si T est un type de classe avec un constructeur par défaut qui n'est ni fourni par l'utilisateur ni supprimé (c'est-à-dire qu'il peut s'agir d'une classe avec un constructeur par défaut défini implicitement ou par défaut), l'objet estinitialisé à zéro et les contraintes sémantiques pour l'initialisation par défaut sont vérifiées, et si T a un constructeur par défaut non trivial, l'objet estinitialisé par défaut;
3)si T est un type tableau, chaque élément du tableau est initialisé par une valeur;
4) sinon, l'objet estinitialisé à zéro.


Lisez à propos de default-initialized :

  • si T est un type de classenon-POD(jusqu'à C++11)(éventuellement qualifié par cv), les constructeurs sont pris en compte et soumis à la résolution desurcharge contre la liste d'arguments vide. Le constructeur sélectionné (qui est l'un desconstructeurs par défaut) est appelé pour fournir la valeur initiale du nouvel objet ;
  • si T est un type tableau, chaque élément du tableau est initialisé par défaut ;
  • dans le cas contraire, aucune initialisation n'est effectuée : les objets à durée de stockage automatique (et leurs sous-objets) contiennent des valeurs indéterminées.

UB !

Le fait que le compilateur vous initialise avec des zéros, ne signifie rien, aujourd'hui il initialise, et demain, après la prochaine mise à jour.....

 
Vladimir Simakov #:

Lisez :

Les effets de l'initialisation des valeurs sont :

1)si T est un type de classe sansconstructeur par défaut ou avec unconstructeur par défaut fourni par l'utilisateur ou supprimé, l'objet estinitialisé par défaut;
2) si T est un type de classe avec un constructeur par défaut qui n'est ni fourni par l'utilisateur ni supprimé (c'est-à-dire qu'il peut s'agir d'une classe avec un constructeur par défaut défini implicitement ou par défaut), l'objet estinitialisé à zéro et les contraintes sémantiques pour l'initialisation par défaut sont vérifiées, et si T a un constructeur par défaut non trivial, l'objet estinitialisé par défaut;
3)si T est un type tableau, chaque élément du tableau est initialisé par une valeur;
4) sinon, l'objet estinitialisé à zéro.


Lisez à propos de default-initialized :

  • si T est un type de classenon-POD(jusqu'à C++11)(éventuellement qualifié par cv), les constructeurs sont pris en compte et soumis à la résolution desurcharge contre la liste d'arguments vide. Le constructeur sélectionné (qui est l'un desconstructeurs par défaut) est appelé pour fournir la valeur initiale du nouvel objet ;
  • si T est un type tableau, chaque élément du tableau est initialisé par défaut ;
  • dans le cas contraire, aucune initialisation n'est effectuée : les objets à durée de stockage automatique (et leurs sous-objets) contiennent des valeurs indéterminées.

UB !

Le fait que le compilateur vous initialise avec des zéros ne signifie rien, aujourd'hui il initialise, et demain, après la prochaine mise à jour.....

Mon billet "Oublié d'ajouter...." a été rédigé en complément du billet précédent :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Particularités du langage mql5, trucs et astuces

mktr8591, 2021.11.18 18:15

@A100




Si vous vous souvenez que mql a été créé à partir du C++, ces deux exemples (leurs homologues) fonctionnent bien là-bas car il n'y a pas de constructeurs dans ces classes (c'est-à-dire qu'il y a un constructeur implicite) :

  • Déclarer ClassX x[n]={} ; entraîne une initialisation de la valeur de chaque élément du tableau.
  • Si ClassX n'a pas de constructeurs personnalisés (mais a un constructeur par défaut unset), alors l'initialisation zéro des objets de la classe est effectuée - indépendamment de l'existence de champs privés.
  • Mais s'il y a des champs const, le ktor par défaut sera implicitement supprimé, donc erreur de compilation.

Exemple en 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;
}

Donc, s'il n'y a pas de champs constants dans la structure/classe, la logique est correcte.


Il traitait d'une certaine situation - lorsqu'une classe n'a pas de constructeur utilisateur et qu'il existe un constructeur implicite qui n'est pas supprimé. Dans ce cas, le point 1 cité par vous n'est pas approprié.

Point"2) si T est un type de classe avec un constructeur par défaut qui n'est ni fourni par l'utilisateur ni supprimé (c'est-à-dire qu'il peut s'agir d'une classe avec un constructeur par défaut défini implicitement ou par défaut), l'objet estzéro initialisé et les contraintes sémantiques pour l'initialisation par défaut sont vérifiées, et si T a un constructeur par défaut non trivial, l'objet estinitialisé par défaut;".


Donc tout s'emboîte.

 
Vladimir Simakov #:

Lisez :

Les effets de l'initialisation des valeurs sont :

1)si T est un type de classe sansconstructeur par défaut ou avec unconstructeur par défaut fourni par l'utilisateur ou supprimé, l'objet estinitialisé par défaut;
2) si T est un type de classe avec un constructeur par défaut qui n'est ni fourni par l'utilisateur ni supprimé (c'est-à-dire qu'il peut s'agir d'une classe avec un constructeur par défaut défini implicitement ou par défaut), l'objet estinitialisé à zéro et les contraintes sémantiques pour l'initialisation par défaut sont vérifiées, et si T a un constructeur par défaut non trivial, l'objet estinitialisé par défaut;
3)si T est un type tableau, chaque élément du tableau est initialisé par une valeur;
4) sinon, l'objet estinitialisé à zéro.


Lisez à propos de default-initialized :

  • si T est un type de classenon-POD(jusqu'à C++11)(éventuellement qualifié par cv), les constructeurs sont pris en compte et soumis à la résolution desurcharge contre la liste d'arguments vide. Le constructeur sélectionné (qui est l'un desconstructeurs par défaut) est appelé pour fournir la valeur initiale du nouvel objet ;
  • si T est un type tableau, chaque élément du tableau est initialisé par défaut ;
  • dans le cas contraire, aucune initialisation n'est effectuée : les objets à durée de stockage automatique (et leurs sous-objets) contiennent des valeurs indéterminées.

UB !

Le fait que le compilateur vous initialise avec des zéros, ne signifie rien, aujourd'hui il initialise, et demain, après la prochaine mise à jour.....

Oups. Je l'ai mal lu. Dans ce cas :

2) si Test un type de classe avec un constructeur par défaut qui n'est ni fourni par l'utilisateur ni supprimé (c'est-à-dire qu'il peut s'agir d'une classe avec un constructeur par défaut défini implicitement ou par défaut), l'objet estzéro initialiséet les contraintes sémantiques pour l'initialisation par défaut sont vérifiées, et si Ta un constructeur par défaut non trivial, l'objet estinitialisé par défaut;
 
fxsaber #:

Super. Il s'avère que la mise à zéro intervient AVANT le constructeur, donc tout est correct. Merci !

Juste au cas où - ceci n'est que pour les statiques (tout ceci concerne le C++). Pour les variables locales, s'il existe un k-tor personnalisé, il n'y a pas de mise à zéro.
 
fxsaber #:

Je n'ai pas vu d'appel de fonction void dans une instruction for. Les autres variantes sont assez courantes.

Vous pouvez écrire ce que vous voulez dans le 3ème paramètre de l'instruction for, en fait, l'instruction for peut remplacer l'instruction if() avec {.....}.

SZZ : J'ai aussi vu des macros comme

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

Vous pouvez écrire ce que vous voulez dans le troisième paramètre de l'instruction for, en fait, l'instruction for peut remplacer l'instruction if() avec {.....}.

SZZ : J'ai aussi vu des macros comme

Enlevez le point-virgule, sinon tout le propos est perdu)))

 
Vladimir Simakov #:

Enlevez le point-virgule, sinon toute signification est perdue)))).

ouais, c'est vrai - cet exemple dans les macros pour mettre ; quand on appelle une macro, je n'utilise pas beaucoup les macros - pas de pratique