2012-03-07 16 views
5

Il puntatore this è mai richiesto? Suppongo che ne avresti bisogno se passassi funzionalmente l'istanza della classe indicata da this. Ma in termini di impostazione/recupero/chiamata/qualsiasi membro, è this sempre facoltativo?Quando è richiesto "questo"?

Ho codificato questo C++ perché è la lingua che mi sto specificamente chiedendo, ma se qualcuno può confermare che il costrutto è lo stesso per Java e altri linguaggi OO che usano un puntatore this, sarebbe apprezzato.

risposta

8

È necessario quando si dispone di una variabile locale con lo stesso nome della variabile membro. In questo caso, si dice che la variabile locale ombreggia la variabile membro. Per ottenere la variabile membro in questa situazione, è necessario utilizzare this.

Alcune persone considerano una buona pratica menzionare esplicitamente che la variabile che si sta modificando è una variabile membro utilizzando sempre this, ma questo non è sempre il caso.

+0

per C++ tua ultima considerazione è vero, ma per Java o C#, non è sempre la convenzione – Geoffroy

+0

Questo è il motivo per cui è il nome sempre il vostro membro variabili in modo diverso da quelle locali, ad es 'm_myVar' o' myVar_' e così via. Poiché l'utilizzo di 'this' non è applicato, la maggior parte dei progetti sceglie di forzare uno standard di denominazione sulle variabili membro. –

+1

Non direi che è una buona forma usare "questo" tutto il tempo. Usalo solo se ci sono nomi in ombra. Di solito si possono evitare anche le ombre. –

11

Ci sono tre casi mi viene in mente:

Quando si vuole semplicemente passare un puntatore alla classe corrente:

class B; 
struct A { 
    B* parent_; 
    A(B* parent) : parent_(parent) {} 
}; 

struct B { 
    A* a; 
    B() : a(new A(this)) {} 
}; 

In una funzione di costruzione o di un membro, in cui un membro è ombreggiato da un argomento:

struct A { 
    int a; 
    void set_a(int a) { this->a = a; } 
}; 

Qui, la variabile membro "a" è ombreggiata dall'argum ent "a", quindi this-> viene utilizzato per accedere al membro anziché all'argomento.

(nell'esempio sopra modificati per essere una funzione piuttosto che di costruzione, dal momento che normalmente non assegnare questo modo in un costruttore)


Quando si accede una variabile pubblica/protetta membro o funzione in una classe di base di una classe template

template <class T> 
struct A { 
    int a; 
}; 

template <class T> 
struct B : public A<T> { 
    int f() { return this->a; } 
} 

qui, a da solo non sarebbe un nome di dipendente, in modo che il compilatore si aspetterebbe di trovare una dichiarazione di esso in B o una base di B che non dipende su T. L'aggiunta di this-> rende la ricerca dipendente dal tipo di this e poiché this è un tipo dipendente, la ricerca di a viene posticipata fino all'istanziazione di f().

Uno potrebbe scrivere return A::a anziché return this->a, ma in presenza di più basi, sia dirette che indirette, utilizzando this-> è più flessibile. Questa sintassi alternativa è anche limitata alle variabili membro e alle funzioni non virtuali: se viene utilizzata con una funzione virtuale, la funzione verrà richiamata direttamente anziché effettuare una chiamata di funzione virtuale.

+0

Puoi sempre usare classname :: variablename per accedervi, in quanto tale può essere usato per questo, ma non è necessario. – PlasmaHH

+0

@PlasmaHH Sì, stavo interpretando la domanda come "in quali situazioni sta scrivendo 'questo' non ridondante 'piuttosto che" in che situazione sta scrivendo' questo 'l'unico modo per ottenere qualcosa " – je4d

+1

Infatti solo il tuo primo esempio è corretto per gli altri due l'uso di 'this' è facoltativo. Nel secondo esempio, l'uso dell'elenco di inizializzazione di Ctor è C++ idiomatico e non avrà il problema dell'ambiguità, ad es. 'A :: A (int a): a (a) {}' è valido e non ambiguo (almeno per il compilatore). –

-1

a volte "questo" è richiesto, forse quando si passa l'oggetto a un'altra funzione. un'occhiata a questo codice C# (per l'apertura di un form modale con questo genitore)

Form1 f = new Form(); 
f.ShowDialog(this); 
+0

Questo non sembra C++. – svick

Problemi correlati