[C++] Qualificatore const e classi

Messaggioda ZfreS » 19/12/2020, 17:26

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)?
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2169 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C++] Qualificatore const e classi

Messaggioda Super Squirrel » 19/12/2020, 23:12

ZfreS ha scritto: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:
Codice:
#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);
}
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 570 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Qualificatore const e classi

Messaggioda vict85 » 20/12/2020, 00:27

Probabilmente c'è un errore nel tuo libro, il compilatore aggiunge un const solo a this.
vict85
Moderatore
Moderatore
 
Messaggio: 10270 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Qualificatore const e classi

Messaggioda ZfreS » 20/12/2020, 10:11

vict85 ha scritto:Probabilmente c'è un errore nel tuo libro, il compilatore aggiunge un const solo a this.

Si si certo, questo lo so. Era una mia domanda se il compilatore aggiungesse const a tutti gli altri parametri.
[URL=https://datesnow.life]Authentic Ladies[/URL]
ZfreS
Cannot live without
Cannot live without
 
Messaggio: 2170 di 4590
Iscritto il: 22/10/2016, 17:52
Località: Usa

Re: [C++] Qualificatore const e classi

Messaggioda feddy » 21/12/2020, 12:08

Aggiungo solo che nel codice di @SuperSquirrel, marcare la funzione const fa sì che non si possa modificare un oggetto di tipo A tramite foo

Codice:
#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 member function 'A::foo' is declared const here: void foo(A &a)const
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2782 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [C++] Qualificatore const e classi

Messaggioda Super Squirrel » 21/12/2020, 22:14

feddy ha scritto:Aggiungo solo che nel codice di @SuperSquirrel, marcare la funzione constfa sì che non si possa modificare un oggetto di tipo Atramite foo

Non sono d'accordo, se
Codice:
void foo(A &a)const

equivale a
Codice:
void foo(A const * const this, A &a)

*this non può essere modificato, ma a sì.
feddy ha scritto:produce member function 'A::foo' is declared const here: void foo(A &a)const

L'errore in questo caso è dovuto al fatto che stai stai modificando this->x e non a.x come nel codice che ho postato in precedenza.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 572 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Qualificatore const e classi

Messaggioda feddy » 22/12/2020, 00:54

È esattamente quello che volevo far intendere quando dicevo che "non posso modificare l'oggetto" tramite la funzione membro foo.

Non intendevo l'oggetto a, bensì mi riferivo a this->x, come hai scritto tu. Volevo solo evidenziare questo per mostrare la differenza tra marcare la funzione const, e marcare const l'argomento, nulla di più :-D
Avatar utente
feddy
Moderatore
Moderatore
 
Messaggio: 2784 di 5934
Iscritto il: 26/06/2016, 00:25
Località: SISSA

Re: [C++] Qualificatore const e classi

Messaggioda Super Squirrel » 22/12/2020, 09:52

feddy ha scritto:È esattamente quello che volevo far intendere quando dicevo che "non posso modificare l'oggetto" tramite la funzione membro foo.

Ah ok, ma quel generico "un oggetto di tipo A" era un po' equivoco! :-D
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 573 di 1486
Iscritto il: 16/05/2013, 22:05


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite