Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 215

 

A proposito, se si obietta un array statico X x[n]; e X ha un k-tor, allora tutti i campi di elementi in esso saranno azzerati prima, anche quelli privati, e solo allora il k-tor sarà chiamato. Quindi non c'è alcuna violazione del paradigma OOP nell'azzeramento dei campi privati.

Ma il fatto che il costruttore non abbia funzionato è un bug.

 
mktr8591 #:

A proposito, se creiamo un array statico X x[n]; e X ha un k-tor, allora tutti i campi di elementi in esso vengono azzerati prima, anche quelli privati, e solo allora viene chiamato il k-tor. Quindi non c'è alcuna violazione del paradigma OOP nell'azzeramento dei campi privati.

È fantastico. Così, si scopre che l'azzeramento viene PRIMA del costruttore, e quindi tutto è corretto. Grazie!

 
Igor Makanu #:

Ho guardato la mia ricerca in MQL5, potrebbe essere peggio, ho anche pompato la storia nell'indicatore di diversi TF:

Posso scrivere molte cose in una dichiarazione for ))))

Non ho mai incontrato una chiamata a una funzione nulla in una dichiarazione for. Ho visto altre varianti abbastanza spesso.

 
mktr8591 #:
Ho dimenticato di aggiungere, se una classe ha campi (oggetti) non banali, allora dopo lo zero-init dell'intero oggetto per tali campi sarà chiamato il loro c-tor di default.

Leggere:

Gli effetti dell'inizializzazione dei valori sono:

1)se T è un tipo di classe senzacostruttore di default o con uncostruttore di default fornito dall'utente o cancellato, l'oggetto èinizializzato di default;
2) se T è un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né cancellato (cioè, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto èinizializzato a zero e i vincoli semantici per l'inizializzazione predefinita sono controllati, e se T ha un costruttore predefinito non banale, l'oggetto èinizializzato a zero;
3)se T è un tipo di array, ogni elemento dell'array è inizializzato con un valore;
4) altrimenti, l'oggetto èinizializzato a zero.


Leggi su default-initialized:

  • se T è un tipo di classenon-POD( possibilmente cv-qualificato)(fino a C++11), i costruttori sono considerati e sottoposti a risoluzione disovraccarico contro la lista di argomenti vuota. Il costruttore selezionato (che è uno deicostruttori predefiniti) viene chiamato per fornire il valore iniziale del nuovo oggetto;
  • se T è un tipo di array, ogni elemento dell'array è inizializzato di default;
  • altrimenti, non viene eseguita alcuna inizializzazione: gli oggetti con durata di memorizzazione automatica (e i loro sottooggetti) contengono valori indeterminati.

UB!

Il fatto che il compilatore inizializzi con degli zeri, non significa nulla, oggi inizializza, e domani, dopo il prossimo aggiornamento....

 
Vladimir Simakov #:

Leggere:

Gli effetti dell'inizializzazione dei valori sono:

1)se T è un tipo di classe senzacostruttore di default o con uncostruttore di default fornito dall'utente o cancellato, l'oggetto èinizializzato di default;
2) se T è un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né cancellato (cioè, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto èinizializzato a zero e i vincoli semantici per l'inizializzazione predefinita sono controllati, e se T ha un costruttore predefinito non banale, l'oggetto èinizializzato a zero;
3)se T è un tipo di array, ogni elemento dell'array è inizializzato con un valore;
4) altrimenti, l'oggetto èinizializzato a zero.


Leggi su default-initialized:

  • se T è un tipo di classenon-POD( possibilmente cv-qualificato)(fino a C++11), i costruttori sono considerati e sottoposti a risoluzione disovraccarico contro la lista di argomenti vuota. Il costruttore selezionato (che è uno deicostruttori predefiniti) viene chiamato per fornire il valore iniziale del nuovo oggetto;
  • se T è un tipo di array, ogni elemento dell'array è inizializzato di default;
  • altrimenti, non viene eseguita alcuna inizializzazione: gli oggetti con durata di memorizzazione automatica (e i loro sottooggetti) contengono valori indeterminati.

UB!

Il fatto che il compilatore inizializzi con degli zeri non significa nulla, oggi inizializza, e domani, dopo il prossimo aggiornamento....

Il mio post "Forgot to add...." è stato scritto come supplemento al post precedente:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Peculiarità del linguaggio mql5, consigli e trucchi

mktr8591, 2021.11.18 18:15

@A100




Se ricordate che mql è stato generato da C++, entrambi questi esempi (le loro controparti) funzionano bene lì perché non ci sono costruttori in queste classi (cioè c'è un costruttore implicito):

  • Dichiarare ClassX x[n]={}; risulta in una inizializzazione del valore di ogni elemento dell'array.
  • Se ClassX non ha costruttori personalizzati (ma ha un costruttore predefinito non impostato), allora viene fatta l'inizializzazione zero degli oggetti della classe - indipendentemente dal fatto che ci siano campi privati.
  • Ma se ci sono campi const, il costruttore di default sarà implicitamente cancellato, quindi errore del compilatore.

Esempio 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;
}

Quindi se non ci sono campi const nella struttura/classe, allora la logica è corretta.


Ha considerato una certa situazione - quando una classe non ha costruttori utente e c'è un costruttore implicito che non viene cancellato. In questo caso il punto 1 da lei citato non è appropriato.

Punto"2) se T è un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né cancellato (cioè, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto èzero-inizializzato e i vincoli semantici per l'inizializzazione di default sono controllati, e se T ha un costruttore di default non banale, l'oggetto èinizializzato di default;".


Quindi tutto si incastra.

 
Vladimir Simakov #:

Leggere:

Gli effetti dell'inizializzazione dei valori sono:

1)se T è un tipo di classe senzacostruttore di default o con uncostruttore di default fornito dall'utente o cancellato, l'oggetto èinizializzato di default;
2) se T è un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né cancellato (cioè, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto èinizializzato a zero e i vincoli semantici per l'inizializzazione predefinita sono controllati, e se T ha un costruttore predefinito non banale, l'oggetto èinizializzato a zero;
3)se T è un tipo di array, ogni elemento dell'array è inizializzato con un valore;
4) altrimenti, l'oggetto èinizializzato a zero.


Leggi su default-initialized:

  • se T è un tipo di classenon-POD( possibilmente cv-qualificato)(fino a C++11), i costruttori sono considerati e sottoposti a risoluzione disovraccarico contro la lista di argomenti vuota. Il costruttore selezionato (che è uno deicostruttori predefiniti) viene chiamato per fornire il valore iniziale del nuovo oggetto;
  • se T è un tipo di array, ogni elemento dell'array è inizializzato di default;
  • altrimenti, non viene eseguita alcuna inizializzazione: gli oggetti con durata di memorizzazione automatica (e i loro sottooggetti) contengono valori indeterminati.

UB!

Il fatto che il compilatore inizializzi con degli zeri, non significa nulla, oggi inizializza, e domani, dopo il prossimo aggiornamento....

Ops, ho letto male. In questo caso:

2) se Tè un tipo di classe con un costruttore predefinito che non è né fornito dall'utente né cancellato (cioè, può essere una classe con un costruttore predefinito implicitamente definito o predefinito), l'oggetto èzero-inizializzatoe i vincoli semantici per l'inizializzazione di default sono controllati, e se Tha un costruttore di default non banale, l'oggetto èinizializzato di default;
 
fxsaber #:

Fantastico. Si scopre che l'azzeramento viene PRIMA del costruttore, quindi tutto è corretto. Grazie!

Solo in caso - questo è solo per la statica (questo è tutto su C++). Per le variabili locali, se c'è un k-tor personalizzato, non c'è azzeramento.
 
fxsaber #:

Non ho visto una chiamata di funzione void in una dichiarazione for. Le altre varianti sono abbastanza comuni.

Potete scrivere qualsiasi cosa vogliate nel terzo parametro dell'istruzione for, infatti, l'istruzione for può sostituire l'istruzione if() con {.....}

SZZ: Ho anche visto macro come

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

Potete scrivere qualsiasi cosa vogliate nel terzo parametro dell'istruzione for, infatti, l'istruzione for può sostituire l'istruzione if() con {.....}

SZZ: Ho anche visto macro come

Togli il punto e virgola, altrimenti si perde tutto il senso)))

 
Vladimir Simakov #:

Togliere il punto e virgola, altrimenti tutto il significato è perso))))

Sì, giusto - questo esempio in macro per mettere ; quando si chiama una macro, non uso molto le macro - non ho pratica