Puntatore this

di il
11 risposte

Puntatore this

Salve a tutti, non so perché non riesco proprio a capire l'utilità del puntatore this.
L'unica cosa che ho capito è che è un puntatore automatico che viene implementato in ogni classe.
Ringrazio a tutti in anticipo

11 Risposte

  • Re: Puntatore this

    In pratica il puntatore 'this' fa riferimento all'istanza della classe utilizzata per chiamare una funzione membro. ad esempio:
    
    class A{
        A(int n);
        //costruttori, eventuale distruttore, funzioni statiche , ecc...
        void Aggiungi(int a);
        private:
            int a;
    };
    
    //.........Implementazione di Aggiungi()
    void A::Aggiungi(int a){
        this->a +=a;
    }
    
    La funzione 'Aggiungi()' utilizza il puntatoe 'this' per operare sulla sua variabile membro 'a' che ha lo stesso nome del parametro di funzione, quindi questo è uno dei casi per il quale si utilizza tale puntatore intrinseco. Un altro caso è l'overloading dell'operatore di assegnazione '=' :
    //
    
    A& A::operator=(const A& rop){
        if(this == &rop) return *this;
        a=rop.a;
        return *this;
    }
    //--------
    A a(3);
    A b;
    b=a; //b varrà 3;
    
    in questo caso 'a=b' viene tradotto in 'a.operator=(b)', per cui il 'this' nella funzione si riferisce ad 'a' , se invece era 'b=a' avremmo avuto 'b.operator=(a)' e quindi 'this' si riferiva a 'b'.
    Non so se ti ho fatto capire qualcosa in merito, sappi solo che 'this' in alcuni casi è molto utile, in altri è addirittura essenziale.
  • Re: Puntatore this

    A ecco , e solo on questi due casi si usa?
  • Re: Puntatore this

    Diciamo che questi due casi sono quelli per cui 'this' viene usato per la maggiore. Però nulla vieta di utilizzarlo in altre funzioni membro. Solo una cosa: dato che 'this' si riferisce all'ISTANZA di una classe, ciò comporta che tale puntatore non può essere usato nelle funzioni statiche (dato che una funzione statica è utilizzabile anche se non sono presenti istanze di tale classe).
  • Re: Puntatore this

    Ok, io però ancora non riesco a capire(sarò scemo) cosa vuol dire la frase:

    "il puntatore 'this' fa riferimento all'istanza della classe"

    cioè il caso delle variabili con lo stesso nome mi è chiaro e anche quello degli operatori, però in generale non riesco a comprenderlo seriamente.Se non ti rompo mi potresti fare un altro esempio al di fuori delle variabili con lo stesso nome e degli operatori.Ti ringrazio per la disponibilità e sopratutto pazienza
  • Re: Puntatore this

    Ok. Facciamo il seguente esempio:
    
    A a;
    A b;
    
    Sono state 'istanziati' due oggetti della classe A, per cui ognuno di essi avrà un puntatore 'this'. se ad esempio faccio:
    
    a=b;
    
    come detto prima questa istruzione viene vista come a.operator=(b), per cui essendo 'a' 'l'istanza di classe' utilizzata per chiamare 'operator=' , il puntatore 'this' sarà quello di 'a'. Al contrario 'b=a' viene vista come detto prima in 'b.operator=(a)' ed essendo 'b' 'l'istanza di classe' utilizzata per chiamare 'operator=' il puntatore 'this' sarà quello di 'b'. Mettiamola così, fra i tanti attributi che sono presenti in una classe, il compilatore ne aggiunge uno , di nome 'this' , che conterrà l'indirizzo in memoria dell'oggetto istanziato:
    
    class A{
        //vari costruttori, funzioi e variabili membro, ecc.
        A *this; //aggiunta in automatico dal compilatore;
    }
    
    Quando poi viene definita una variabile di tipo A:
    
    A a;
    
    un'istanza di A viene allocata in memoria, e al puntatore 'this' viene assegnato l'indirizzo in memoria di tale istanza. Per cui per tutto il ciclo di vita della variabile di tipo A, nelle funzioni membro è possibile utilizzare tale puntatore per riferirsi all'istanza stessa, ad esempio come detto prima quando ci si tova nella situazione di nomi variabili uguali.
    Speo che così le idee siano un po' più chiare.
  • Re: Puntatore this

    Scusa ma non riesco a capire(non mi prendere a parolacce), cioè avendo ad esempio una classe
    
    A a;
    
    col puntatore this che ci faccio?
    se metto this sostituisco l'oggetto?
    
    this.a
    
  • Re: Puntatore this

    No. 'this' lo puoi solo utilizzare all'interno di una funzione membro di una classe. è come se la variabile 'a' di tipo A ha una variabile privata 'this' che punta ad 'a' stesso.
  • Re: Puntatore this

    Quindi non la posso utilizzare nel main(o comunque quando l'oggetto è istanziato)?
  • Re: Puntatore this

    No, può essere utilizzato SOLO in una funzione membro di una classe.
  • Re: Puntatore this

    E quindi quando ad esempio alla fine di una funzione c'è
    
    return this;
    
    cosa vuol dire, cioè cosa ritorna?
  • Re: Puntatore this

    Ritorna il valore del puntatore 'this' , cioè l'indirizzo di memoria dell'istanza a cui fa riferimento.
Devi accedere o registrarti per scrivere nel forum
11 risposte