[C++] Qualificatore const e classi

oleg.fresi
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
Super Squirrel
"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);
}

vict85
Probabilmente c'è un errore nel tuo libro, il compilatore aggiunge un [inline]const[/inline] solo a [inline]this[/inline].

oleg.fresi
"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.

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]

#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]

Super Squirrel
"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.

feddy
È 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ù :-D

Super Squirrel
"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! :-D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.