[C++] Qualificatore const e classi
Avrei un dubbio per quanto riguarda il qualificatore const in c++. Per esempio se ho una funzione così definita: void foo(const A& a), il qualificatore const indica che la funzione non può modificare l'oggetto; implicitamente, però il compilatore aggiunge alla lista dei parametri il seguente: A* const this. Nel caso io dichiarassi la mia funzione in questo modo: void foo( A& a) const, il compilatore la vedrebbe in questo modo: $void foo(const A* const this, const A& a). La mia domanda è: nel secondo caso, il qualificatore const "esterno", si applica solo al puntatore this o anche agli altri parametri (anche se già const)?
Risposte
"ZfreS":
Nel caso io dichiarassi la mia funzione in questo modo: void foo( A& a) const, il compilatore la vedrebbe in questo modo: $void foo(const A* const this, const A& a).
Da cosa l'hai dedotto? Il fatto che il seguente codice compili sembra smentirti:
#include <iostream> class A { int x; public: void foo(A &a)const { a.x = 5; } }; int main() { A a_1, a_2; a_1.foo(a_2); }
Probabilmente c'è un errore nel tuo libro, il compilatore aggiunge un [inline]const[/inline] solo a [inline]this[/inline].
"vict85":
Probabilmente c'è un errore nel tuo libro, il compilatore aggiunge un [inline]const[/inline] solo a [inline]this[/inline].
Si si certo, questo lo so. Era una mia domanda se il compilatore aggiungesse const a tutti gli altri parametri.
Aggiungo solo che nel codice di @SuperSquirrel, marcare la funzione [inline]const[/inline] fa sì che non si possa modificare un oggetto di tipo [inline]A[/inline] tramite [inline]foo[/inline]
produce [inline]member function 'A::foo' is declared const here: void foo(A &a)const[/inline]
#include <iostream> struct A { int x; void foo(A &a)const { x = 5; } }; int main() { A a_1, a_2; a_1.foo(a_2); }
produce [inline]member function 'A::foo' is declared const here: void foo(A &a)const[/inline]
"feddy":
Aggiungo solo che nel codice di @SuperSquirrel, marcare la funzione [inline]const[/inline]fa sì che non si possa modificare un oggetto di tipo [inline]A[/inline]tramite [inline]foo[/inline]
Non sono d'accordo, se
void foo(A &a)const
equivale a
void foo(A const * const this, A &a)
[inline]*this[/inline] non può essere modificato, ma [inline]a[/inline] sì.
"feddy":
produce [inline]member function 'A::foo' is declared const here: void foo(A &a)const[/inline]
L'errore in questo caso è dovuto al fatto che stai stai modificando [inline]this->x[/inline] e non [inline]a.x[/inline] come nel codice che ho postato in precedenza.
È esattamente quello che volevo far intendere quando dicevo che "non posso modificare l'oggetto" tramite la funzione membro [inline]foo[/inline].
Non intendevo l'oggetto [inline]a[/inline], bensì mi riferivo a [inline]this->x[/inline], come hai scritto tu. Volevo solo evidenziare questo per mostrare la differenza tra marcare la funzione [inline]const[/inline], e marcare const l'argomento, nulla di più
Non intendevo l'oggetto [inline]a[/inline], bensì mi riferivo a [inline]this->x[/inline], come hai scritto tu. Volevo solo evidenziare questo per mostrare la differenza tra marcare la funzione [inline]const[/inline], e marcare const l'argomento, nulla di più

"feddy":
È esattamente quello che volevo far intendere quando dicevo che "non posso modificare l'oggetto" tramite la funzione membro [inline]foo[/inline].
Ah ok, ma quel generico "un oggetto di tipo [inline]A[/inline]" era un po' equivoco!
