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

 
Dmitry Fedoseev:
Non è il tuo, ma uno totalmente straniero con lo stesso tipo.

Cosa non è tuo? Che il tipo è lo stesso?

Sta dicendo che un metodo costante non può cambiare la classe di qualcun altro?

E quando rispondi, per favore sii più specifico, non ho capito cosa stai cercando di dire.

 
Alexey Kozitsyn:

Cosa non è tuo? Che il tipo è lo stesso?

Sta dicendo che un metodo costante non può cambiare la classe di qualcun altro?

E quando rispondi, per favore sii più esplicito, non ho capito cosa intendi.

Sei tu che stai scrivendo in modo incomprensibile Può cambiare la classe di qualcun altro di qualsiasi tipo e dello stesso tipo di se stesso.
 

Per dirla semplicemente. In un metodo costante, è impossibile cambiare i valori delle variabili dichiarate nella stessa classe in cui si trova il metodo costante (o dichiarate nel suo genitore). È così?

 
Dmitry Fedoseev:
Sei tu che non capisci quello che stai scrivendo Può cambiare la classe di qualcun altro di qualsiasi tipo e uguale a se stessa.

Forse dovresti stare attento a quello che scrivi, dopo tutto. Come può un metodo cambiare una classe? Forse un oggetto di classe?

E la domanda era nella dichiarazione:

Un metodo costante non può cambiare i membri della sua classe.

Alexey ha dato un esempio che può cambiare, quindi non credo che l'affermazione sia corretta, volevo sentire il commento di Vasiliy.

 
Alexey Kozitsyn:

Forse dovresti stare attento a quello che scrivi, dopo tutto. Come può un metodo cambiare una classe? Forse un oggetto di classe?

E la domanda era nella dichiarazione:

Alexey ha dato un esempio che può cambiare, quindi penso che l'affermazione sia sbagliata, volevo sentire il commento di Vasily.

Che ne dici di leggere con più attenzione? -"cambiare i valori delle variabili dichiarate"

Come puoi parlare dell'affermazione di Alexey? Non l'ha solo affermato, l'ha confermato per davvero, ha dato un esempio, lo si può buttare in un editor e vedere quando si compila e quando no.

 
Dmitry Fedoseev:

Per dirla semplicemente. In un metodo costante, è impossibile cambiare i valori delle variabili dichiarate nella stessa classe in cui si trova il metodo costante (o dichiarate nel suo genitore). È così?

No. Sapete che ogni oggetto di una classe ha il suo insieme di variabili dichiarate in questa classe, vero? E un metodo costante non può cambiare solo l'oggetto (cioè l'insieme) da cui è stato chiamato.
 
Alexey Kozitsyn:

Forse dovresti stare attento a quello che scrivi, dopo tutto. Come può un metodo cambiare una classe? Forse un oggetto di classe?

..

Come questo:

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

 
Alexey Kozitsyn:
No. Sapete che ogni oggetto di una classe ha il suo insieme di variabili dichiarate in quella classe, vero? E un metodo costante non può cambiare solo l'oggetto (cioè l'insieme) da cui è stato chiamato.
Cosa c'entra la chiamata? È la posizione del metodo e delle variabili che conta. Se il metodo e le variabili si trovano nella stessa classe, non può essere cambiato. Se la classe viene passata per riferimento come parametro, è possibile.
 
struct X
{

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

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

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

   
};
Questo ha più senso.
 
Dmitry Fedoseev:
Cosa c'entra la chiamata? Ciò che conta è la posizione del metodo e delle variabili. Se il metodo e le variabili si trovano nella stessa classe, non si può cambiare. Se la classe viene passata per riferimento come parametro, è possibile.
La sfida 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ò.