Cosa significa il modificatore const dopo una dichiarazione di metodo

 

Fatta una domanda in privato, cosa significa. Ho trovato un esempio utile sul forum che aiuta a chiarirlo.
A proposito, se parlate inglese è molto utile cercare su Google tale domanda in inglese, non in MQL, ma in C++. Ad esempio così
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Ci saranno un sacco di link a forum di programmazione pura, e C++ è abbastanza simile a MQL

Ho tradotto i commenti in russo e ho fatto alcuni aggiustamenti per la compatibilità con MQL. Sto allegando lo script qui sotto, compilatelo e tutto diventerà chiaro.

struct X
{
    void foo() const 
    {
        _x = 42; // ERROR! метод объявлен, как const, не можем менять члены 
        _y = 42; // ERROR! 
    }

    void bar(X& obj) const 
    {
        obj._x = 42; // OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // ERROR!
    }

    void bar(X const& obj) 
    {
        obj._x = 42; // ERROR! obj передается по ссылке, как const
        obj._y = 42; // ERROR! obj передается по ссылке, как const
        _x = 42; // OK! метод объявлен без const на сонце
    }

    int _x, _y;
};
File:
TestConst.mq4  2 kb
 
Alexey Volchanskiy:

Chiesto in privato cosa significa questo. Si è precipitato sul forum per rispondere, poiché ho trovato un esempio utile che porta chiarezza.
A proposito, se parli inglese, è molto utile cercare su Google tale domanda in inglese, non in MQL, ma in C++. Ad esempio così
http://www.google.com/search?q=const+in+c%2B%2B+after+function&oq=const+in+c%2B%2B&sourceid=chrome&ie=UTF-8
Ci saranno un sacco di link a forum di programmazione pura, e C++ è abbastanza simile a MQL

Ho tradotto i commenti in russo e ho fatto alcuni aggiustamenti per la compatibilità con MQL. Allego lo script qui sotto, basta compilarlo e tutto diventerà chiaro.

La documentazione non fa chiarezza?

Un metodo con il modificatoreconst è chiamato costante e non può modificare i membri impliciti della sua classe. La dichiarazione di funzioni di classe costanti e di parametri costanti è chiamatacontrollo di const-correctness. Con questo controllo si può essere sicuri che il compilatore terrà traccia dei valori invariati degli oggetti e genererà un errore in fase di compilazione in caso di violazione.

Il modificatoreconst dovrebbe essere posto dopo l'elenco degli argomenti all'interno della dichiarazione di classe. La definizione al di fuori di una classe dovrebbe anche includere il modificatoreconst:

Un ulteriore argomento per usare il controllo di integrità è che il compilatore fa delle ottimizzazioni speciali, ad esempio mettendo un oggetto persistente in memoria di sola lettura.

Unafunzione statica non può essere definita con il modificatoreconst, perché questo modificatore garantisce che i membri dell'istanza rimangono invariati quando tale funzione viene chiamata. Ma, come detto sopra, una funzione statica per definizione non può accedere a membri di classe non statici.

https://www.mql5.com/ru/docs/basis/oop/staticmembers

Inoltre, secondo me, non hai presentato l'esempio più riuscito di composizione di una struttura (prima i metodi, poi i dati dei membri). E, per questo, è meglio avvolgere tutto in una classe piuttosto che in una struttura, poiché le strutture sono di solito usate come unione di dati (senza metodi).

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Kozitsyn:

La documentazione non chiarisce le cose?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

E secondo me, non hai fornito il miglior esempio di mettere insieme una struttura (prima i metodi, poi i dati dei membri). E, per questo, è meglio avvolgere il tutto in una classe piuttosto che in una struttura, poiché le strutture sono di solito usate come unione di dati (senza metodi).

Contiene

Mi sono ricordato che era scritto da qualche parte in un documento, ma non sono riuscito a trovarlo. Ho copiato un esempio da stackoverflow. Dove mettere i dati è una questione personale del programmatore, anche se io lo metto all'inizio. Se usare strutture o classi dipende dal programmatore )))

 
Alexey Volchanskiy:

Entrando in

Mi sono ricordato che era scritto da qualche parte nel documento, ma non l'ho trovato sul posto. Ho rubato un rapido esempio da stackoverflow. Sta al programmatore decidere dove mettere i dati, anche se io stesso li ho messi all'inizio. Se usare strutture o classi dipende dal programmatore ))))

Si può dire "una questione privata" di molte cose in questo modo. Ma sei tu che lo stai spiegando a qualcuno e non di persona ma pubblicamente. E il tuo "affare privato" contraddice un buon stile di programmazione. E la persona a cui lo state spiegando, e molti altri utenti possono prenderlo come un buon stile, cosa che non è.

E sulla persona che ha voluto (o forse guidato) il corso qui, un tale "bloop, bloop, bloop" dice molto.

 
Метод с модификатором const è chiamato costante e non può modificare i membri impliciti della sua classe.
Quali membri sono espliciti e quali impliciti?
 
Dmitry Fedoseev:
Quali membri sono espliciti e quali impliciti?

Apparentemente, in questo contesto, questi sono i membri che chiamano il metodo. O, altrimenti, sono i membri a cui si può accedere tramite questo dal metodo.

 

In C++, questo significa che un metodo non può cambiare i membri della classe, eccetto i membri dichiarati mutabili.

Poiché in MQL difficilmente ci si può aspettare questo, significa che un metodo non può cambiare un oggetto in linea di principio.

 
Комбинатор:

In C++, questo significa che un metodo non può cambiare i membri della classe, eccetto i membri dichiarati mutabili.

Poiché in MQL difficilmente ci si può aspettare questo, significa che un metodo non può cambiare un oggetto in linea di principio.

Un metodo costante non può cambiare solo l'oggetto che lo ha chiamato. Ma se un altro oggetto viene passato al metodo senza modificatore const, esso (il metodo) può cambiarlo con successo.
 
Alexey Kozitsyn:
Un metodo costante non può cambiare solo l'oggetto che lo ha chiamato.
È una svista?
 
Alexey Volchanskiy:
È un errore di battitura?
Spiega cosa intendi con questo?
 
Ilmetodo costante è un altro esempio del proverbio "abbiamo cercato di fare meglio, ma è risultato essere lo stesso di sempre". Penso che questo sia un motto per C++ a tutti. Non c'è un uso pratico, ma complica significativamente la progettazione di programmi OOP, perché è necessario controllare costantemente il tipo di oggetto modificato (deve essere anche costante).