2012-03-06 15 views
12

Dentro de una función miembro de una clase en C++, ¿hace una diferencia, si uso this->dataMember o solo dataMember? ¿Qué se considera mejor estilo? ¿Hay alguna diferencia de rendimiento?¿Debo usar `this` dentro de una clase?

(no estoy hablando sobre el caso en que una variable local tiene el mismo nombre que el miembro de datos, en cuyo caso se debe, a mi conocimiento, utilizar this-> distinguir entre ellos.)

Respuesta

4

es simplemente redundante para usar this-> para llamar a miembros, a menos que desee distinguir semánticamente entre locales y miembros rápidamente. mucha gente usa el prefijo m_ para los miembros de la clase, para evitar escribir this-> todo el tiempo.

1

uso esto cuando usted tiene un miembro oculto/privada =) en cualquier otro caso que no hacer una diferencia =)

desde el centro de información de IBM cito lo siguiente

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->). 
1

usando " esto-> "es mejor (está seguro de que son los miembros) pero no hace la diferencia

0

Si una función de plantilla realiza una llamada a una función miembro de modo que la llamada no dependa de ningún parámetro de plantilla, this-> se puede usar para ayudar al compilador como alternativa al MyUtopicClass<int, double, double>::vin().

+2

Cuidado: si 'vin' es una función virtual, entonces' this-> vin() 'y' MyUtopicClass :: vin() 'son diferentes. – aschepler

6

Esto es una cuestión de estilo. A algunas personas les gusta el this-> extra para que sea más obvio que estás accediendo a un miembro de la clase. Pero si cree que es lo suficientemente obvio sin él, no habrá diferencia en el código o el rendimiento generado.

(Además del caso que ha mencionado con ámbitos superpuestos, this-> puede también ser obligatorio en una plantilla cuando se trata de nombrar a un miembro de una clase de base de tipo dependiente.)

19

Como regla general, se trata de una cuestión de convenciones locales. La mayoría de los lugares que he visto no usan this-> excepto cuando sea necesario, y eso es la convención que prefiero también, pero he escuchado que las personas que prefieren lo usan sistemáticamente.

Hay dos casos cuando es necesario. El primero es si ha ocultado el nombre con el mismo nombre en alcance local; si, por ejemplo, tiene un miembro llamado toto, y también ha llamado a su función argumento toto. Muchas convenciones de codificación marcan el miembro o los argumentos para evitar este caso , p. todos los nombres de miembros comienzan con my o m_, o un nombre de parámetro comenzará con the.

El otro caso es que this-> se puede utilizar en una plantilla para hacer que un nombre dependa. Esto es relevante si una clase de plantilla hereda de un tipo dependiente de y desea acceder a un miembro de la base, p.:

template <typename T> 
class Toto : public T 
{ 
public: 
    int f() 
    { 
     return this->g(); 
    } 
}; 

Sin la this-> aquí, g() sería un nombre no dependiente, y el compilador búsquelo en el contexto de la definición de plantilla, sin tomar la clase base en la consideración.

+0

Esta es una gran respuesta, no había considerado el caso de la plantilla. – MadPumpkin

5

Siempre uso this al llamar al miembro funciones.

  1. Convierte el nombre de la función en un nombre dependiente para que las funciones de miembro de la clase base se encuentren dentro de una plantilla de clase.
  2. Suprime la búsqueda dependiente de argumentos. ADL tiene sus ventajas, pero puede conducir a un comportamiento sorprendente, y me gusta si no se interpone en mi camino.
  3. No tiene inconvenientes reales, por lo que lo uso para todas las llamadas a funciones de miembros por razones de coherencia.
  4. Programa mucho en Python donde es obligatorio un self explícito, por lo que no es una carga real para mí.

Pero para los miembros de datos lo uso solo cuando es necesario porque no hay ADL. Para responder a sus preguntas específicas:

Dentro de una función miembro de una clase en C++, ¿hace una diferencia, si uso this-> dataMember o simplemente dataMember?

Sí, si esto está dentro de una plantilla de clase. Entonces dataMember se considera un nombre no dependiente, lo que puede conducir a diferencias semánticas. Por ejemplo:

#include <iostream> 

int i = 1; 

struct R { 
    int i; 
    R(): i(2) { } 
}; 

template<typename T> 
struct S: T { 
    void f() { 
    std::cout << i << ' '  // selects ::i 
       << this->i  // selects R::i 
       << std::endl; 
    } 
}; 

int main() { 
    S<R>().f(); 
} 

Lo que se considera mejor estilo?

No creo que haya una opinión fuerte dentro de la comunidad sobre esto. Usa cualquier estilo, pero sé consistente.

¿Hay alguna diferencia de rendimiento?

Estoy bastante seguro de que no es así.

Cuestiones relacionadas