Cosa significa il modificatore const dopo una dichiarazione di metodo - pagina 5

 
Alexey Kozitsyn:
Quello che si dice qui è che se l'oggetto1 della classe A chiama un metodo costante della classe A, allora quel metodo non può cambiare quell'oggetto1 (cioè l'oggetto1 che lo ha chiamato). Se però l'oggetto1 viene passato per riferimento allo stesso metodo costante, ma chiamato dall'oggetto2 della classe A, allora l'oggetto1 può essere cambiato. L'oggetto2, a sua volta, non può.

Come può un oggetto chiamare un metodo? Un metodo può essere chiamato da una funzione o da un altro metodo.

Non è solo un metodo di classe che viene chiamato, ma un metodo di un oggetto specifico. La classe stessa è un'astrazione.

 
Dmitry Fedoseev:

Come può un oggetto chiamare un metodo? Un metodo può essere chiamato da una funzione o da un altro metodo.

Non è solo un metodo di classe che viene chiamato, ma un metodo di un oggetto specifico. La classe stessa è un'astrazione.

Ecco cosa c'è di così banale. E un record del tipo

obj.method();

Come si chiama?

Lo stai scrivendo tu stesso:

Non è solo un metodo di classe che viene chiamato, ma un metodo di un oggetto specifico.

Si può anche dire che è accettabile:

method();

Che cosa chiama il metodo?

Cioè, da quale metodo viene chiamato?

 
@Alexey Kozitsyn:

Questo è difficile. E una voce come...

come lo chiami questo?

Lo scrivi tu stesso:

Ditemi voi che è permesso:

Cosa chiama il metodo?

Cioè, qual è il metodo usato per chiamarlo?

Guarda la situazione. Siete voi ad avere problemi, non io. L'esempio di Alexey ti sembra scorretto, mentre per me è abbastanza chiaro e comprensibile.

--

"Una voce di tipo" si chiama una chiamata al metodo "method" dell'oggetto "obj".

--

"Mi dirai anche che una tale registrazione è ammissibile" - l'impressione è che sia tu a scrivere una cosa del genere.

---

Il metodo non chiama nulla. Il metodo viene chiamato.

 
Dmitry Fedoseev:

Guarda la situazione. Sei tu, non io, ad essere confuso. L'esempio di Alexei ti sembra scorretto, mentre a me sembra abbastanza chiaro e comprensibile, non mi ha provocato nessuna domanda, ma mi ha solo dato una comprensione.

--

"Una voce di tipo" si chiama una chiamata al metodo "method" dell'oggetto "obj".

--

"Mi dirai anche che una tale registrazione è ammissibile" - l'impressione è che sia tu a scrivere una cosa del genere.

---

Il metodo non chiama nulla. Il metodo viene chiamato.

L'esempio di Alexei è accettabile, ma non dovrebbe, secondo la mia opinione personale, essere un esempio per gli altri.

Vedi, non hai ancora risposto alla mia domanda: cosa avvia una chiamata di metodo di una classe (o altrimenti, cosa invoca un metodo (non cosa viene invocato attraverso un metodo, ma cosa/chi invoca il metodo stesso))?

Qualsiasi metodo. È una domanda semplice, hai scritto un articolo per principianti su OOP.

Un metodo non chiama nulla. Il metodo viene chiamato.

Allora, con cosa si chiama?
 
Alexey Kozitsyn:

1. L'esempio di Alexei è accettabile, ma non dovrebbe, secondo la mia opinione personale, essere un esempio per gli altri.

2. Vedi, non hai ancora risposto alla mia domanda: cosa inizializza una chiamata di metodo di classe (o altrimenti, cosa invoca un metodo (non cosa viene invocato tramite un metodo, ma cosa/chi invoca il metodo stesso))?

3. qualsiasi metodo. È una domanda semplice, hai scritto un articolo per principianti su OOP.

1. Suggerisci il tuo esempio.

2. Nessuna risposta. Perché non so di cosa stiamo parlando.

3. Neanche io so di cosa stiamo parlando.

 
void fun(){
   obj.method();
}
Il metodo "method" dell'oggetto "obj" è chiamato dalla funzione "fun".
 
Dmitry Fedoseev:

1. Offri il tuo esempio personale.

2. Nessuna risposta. Perché non so di cosa stiamo parlando.

3. Neanche io so di cosa stiamo parlando.

2. La discussione riguarda ciò che chiama il metodo della classe (non il metodo statico). Il metodo della classe è chiamato dall'oggetto della classe o altrimenti, l'oggetto della classe avvia la chiamata del metodo della classe, per esempio questo:

obj.method();   // obj - объект класса А, method() - метод класса А

Se il metodo è costante, non può modificare l'oggetto attraverso il quale è stato chiamato, cioè l'oggetto obj. Un oggetto (ad esempio obj2) passato ad esso, d'altra parte:

obj.method( obj2 );

può essere modificato se passato per riferimento senza un modificatore const. Questo è tutto.

All'inizio non ho capito le affermazioni dei "corefeys" del forum:

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

Cosa significa il modificatore const dopo la dichiarazione del metodo

Combinator, 2016.01.31 20:32

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

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

Oppure

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

Cosa significa il modificatore const dopo la dichiarazione del metodo?

Vasiliy Sokolov, 2016.02.01 11:55

Un metodo 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).

o

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

Cosa significa il modificatore const dopo la dichiarazione del metodo

Vasiliy Sokolov, 2016.02.01 14:02

Esempio Alexey ha scritto. Un metodo costante non può cambiare i membri della sua classe...

Beh, perché non può farlo? Tutto cambia perfettamente. E la formulazione stessa non è corretta: un metodo costante non può cambiare i membri di un'istanza della sua classe.

 
Vasiliy Sokolov:

Non lo nego. Sharpe è davvero una lingua perfetta, grande e bella.

Ok, diciamo che puoi sempre cavartela con la costrizione. Ma è meglio che ti spieghi brevemente con un esempio, cosa dà const? Qual è il suo vero uso? Per esempio, e preferibilmente non scritto dal nulla.

Una cosa è quando si scrive un progetto per se stessi e l'intero progetto in migliaia - decine di migliaia di stringhe. Un'altra cosa è quando dai un progetto di milioni di righe a un cliente e un Harikrishna Hindu è seduto lì senza nessuna idea. Ho lavorato con gli indù di Bangalore, e il livello era effettivamente inferiore a quello dei nostri ragazzi.

È come lì: si formano come programmatori e portano il resto dei loro parenti a lavorare, e potrebbero non sapere proprio nulla. Sono zingari.

E se il codice critico è impacchettato in una libu, c'è meno possibilità di corruzione. Questo è quello che penso.

 
Alexey Kozitsyn:

...

Perché non può?! Tutto può essere cambiato benissimo. E la formulazione stessa non è corretta: un metodo costante non può cambiare i membri di un'istanza della sua classe.

Questo è quello che voglio dire perché non stiamo parlando del tipo in questo contesto. "La propria classe" è ovviamente la propria istanza (cioè l'oggetto).

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

Il membro_x appartiene alla stessa classe del metodo bar.

C obj._x - qui il membro _x è in una classe straniera obj.

Mi sembra accettabile parlare di una classe piuttosto che di un'istanza, perché è ovvio che _x appartiene alla nostra classe, che noi scriviamo, e obj.x alla classe straniera, che noi gestiamo.

Parlando di terminologia OOP, tutta la terminologia qui è un po' di questo (o anche molto).

 

Personalmente, ho sempre inteso i metodi const come metodi che non possono cambiare le variabili di classe.

Li ho usati molto raramente, perché ho spesso incontrato una situazione in cui la ridefinizione di un metodo richiede di cambiare qualcosa, mentre il metodo base è costante (è già stato menzionato qui).

I metodi statici sono ampiamente utilizzati. In quasi tutte le classi complesse. Di solito questi sono metodi aggiuntivi "di servizio" che non richiedono l'accesso alle variabili di classe.

Inoltre, per le costanti come "numero di secondi in un giorno", cerco di usare un costrutto const statico invece di #define. In questo caso, la dichiarazione e l'inizializzazione di tale costante sono in posti diversi, ma il controllo del tipo si verifica e mi aiuta più di una volta.

Motivazione: