2009-10-22 11 views
6

la pregunta es simple ... ¿hay alguna diferencia en el uso de esta-> su variable o su variable directamente por alguna razón?el puntero "this" dentro de una clase

No encuentro ningún problema con eso, pero estoy usando esto-> mucho y me gustaría saber si hay alguna diferencia antes de seguir adelante.

Vi un comentario aquí y no recuerdo qué hilo, pero la persona dijo algo sobre el uso de la palabra clave "esto".

Personalmente, me parece agradable de usar que la variable directamente. Hace que el código sea más fácil y bonito.

Joe

+2

ver: http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer –

+0

La mayoría de las pautas de codificación que he leído fruncen el ceño al hacer eso sin una buena razón . Es el ruido de código que no agrega ningún significado. Cualquiera que lea su código debería ser capaz de inferir del contexto que está usando un miembro de la clase. – dss539

+0

El uso de 'esto' explícitamente hace que el programa sea más legible – Xinus

Respuesta

12

No, no hay ninguna diferencia real, es simplemente un calificador de ámbito. Sin embargo, suponga un método

void SetFoo(Foo foo) 
{ 
    this->foo = foo; 
} 

donde este-> foo es un miembro privado. Aquí le permite tomar un parámetro con el mismo nombre que una variable de clase/instancia.

0

Esto fue una especie de pregunta y respuesta sobre C# here y creo que la respuesta (al menos la mía) es la misma. Es preferencia

1

Encuentro que usar this hace que mi código sea más legible, pero no hay ninguna razón para hacerlo. Si observa el código ensamblador que genera su compilador, debe ser funcional (y literalmente) idéntico.

Básicamente, cuando se llama a la función, se pasa un argumento oculto this que luego se utiliza para descubrir qué variables están donde. Si usa las variables directamente, sin un this->, no está haciendo nada excepto usar azúcar sintáctico.

16

En la mayoría de los casos no hay diferencia. Sin embargo, hay situaciones en las que tiene una diferencia:

class foo 
{ 
    int i; 
    void bar() { 
     int i = 3; 
     i; // refers to local i 
     this->i; // refers to the member i 
    } 
}; 

Además, con plantillas que pueda necesitar para calificar a un miembro con this-> de manera que la búsqueda de nombres se retrasa:

template<typename T> 
struct A 
{ 
    int i; 
    T* p; 
}; 

template<typename T> 
struct B : A<T> 
{ 
    void foo() { 
     int k = this->i; // here this-> is required 
    } 
}; 

un compilador que hace adecuadamente el "búsqueda en dos fases" se quejará en caso de que elimine "this->" que no sabe lo que se supone que soy. "this->" dice que es un miembro de una clase base. Como la clase base depende de un parámetro de plantilla, la búsqueda se retrasa hasta que se crea una instancia de la plantilla de clase.

+0

+1 para señalar el problema de la plantilla. gcc por lo general dice que algo a lo largo de la línea ' no depende de un parámetro de plantilla, por lo que una definición debe estar disponible'. –

Cuestiones relacionadas