2010-02-25 26 views
34

duplicados posibles: Hace
Is excessive use of this in C++ a code smell¿Cuándo debería usar la palabra clave "this" en C++?

años, tengo la costumbre de utilizar this-> cuando se accede a las variables miembro. Sabía que no era estrictamente necesario, pero pensé que era más claro.

Entonces, en algún momento, empecé a preferir un estilo más minimalista y se detuvo esta práctica ...

Me pidieron recientemente por uno de mis compañeros más jóvenes si yo pensaba que era una buena idea y yo descubrí que realmente no tenía una buena respuesta para mi preferencia ... ¿Es realmente una elección totalmente estilística o existen razones reales por las que no prefija este prefijo-> en los accesos a las variables miembro?

+0

Dupe http://stackoverflow.com/questions/1128837/using-this-in-front-of-member-variables-in-c y http://stackoverflow.com/questions/1057425/is-excessive- use-of-this-in-ca-code-smell –

+0

Consulte también "¿Hay alguna razón para usar' this-> '?": http://stackoverflow.com/questions/577243/is-there-any-reason -to-use-this – sth

Respuesta

35

Si bien esto es una cuestión totalmente subjetiva, creo que el general C++ comunidad prefiere no para tener this->. Es abarrotado, y no es necesario en absoluto.

Algunas personas lo utilizan para diferenciar entre variables y parámetros de miembro. Una práctica mucho más común es simplemente prefijar las variables de sus miembros con algo, como un guión bajo único o un m, o m_, etc.

Eso es mucho más fácil de leer, en mi opinión. Si necesita this-> para diferenciar entre variables, lo está haciendo mal. Cambie el nombre del parámetro (de x a newX) o tenga una convención de nomenclatura de miembro miembro.

La consistencia se prefiere, por lo que en vez de forzar this-> en sí mismo para los pocos casos, es necesario diferenciar (nota en las listas de inicializador esto es completamente bien definida: x(x), donde el miembro de x es inicializado por el parámetro x) , solo consigue mejores nombres de variables.

Esto deja la única vez que uso this: cuando realmente necesito la dirección de la instancia, por la razón que sea.

+2

Claramente, "m_" es una especie de amor-lo-odio. Yo lo amo yo mismo Tener p_Thing, l_Thing y m_Thing a los que se hace referencia en el mismo método no es inusual cuando Thing es simplemente el nombre lógico para los tres. Es bastante común tener al menos dos clash (getters y setters, por ejemplo) que tiene sentido para mí aplicar la convención todo el tiempo. – Steve314

+1

¿Todavía usa el prefijo 'm'? – StackedCrooked

+0

@StackedCrooked: Ya no codigo mucho C++, entonces no. :) Si tuviera que hacerlo, sería una guía de estilo de mi empresa, que es colocar un guión bajo al final del nombre. Mi código personal, probablemente terminaría usando el mismo estilo por costumbre. – GManNickG

6

Cuando hay una ambigüedad entre, por ejemplo, un parámetro de función y una variable de instancia.

¡Por supuesto que debe evitarse esta ambigüedad! Podría ser preferible cambiar el nombre del parámetro función en lugar de incurrir en gastos indirectos (es decir prefijos) para todos los accesos a los parámetros de instancia aunque ...

+1

¿No sería tan malo crear una ambigüedad semejante? –

+3

Use una convención de nomenclatura que evite dicha ambigüedad, p. preceder a todos los miembros de datos con m_. – Patrick

+15

m_ es horrible, como cualquier otro prefijo. – Finglas

8

Personalmente nunca utilizar esto, excepto:

  • cuando necesito pasar 'esto' como un argumento a un método de otra clase
  • en la ejecución del operador de asignación
5

Se puede usar cuando tiene variables en un ámbito "superior" al que está trabajando.

int i; 
public void foo() { 
    int i; 
    i = 3; // assign local variable 
    this->i = 4; // assign global variable 
} 

Además de acceder a las variables en otro ámbito, estoy de acuerdo con su "elección minimalista". Menos es más.:-)

+2

Esta situación debe evitarse. –

+0

¿Por qué declarar una variable local que (según una convención común) pretende afirmar falsamente ser una variable miembro? – Steve314

+0

Por supuesto que no debe nombrar una variable local como esa, solo fue un ejemplo. – Patrick

3

Me gusta usarlo para aclaraciones, como cuando accedo a miembros que fueron heredados. Le recuerda al lector de dónde proviene la variable si no tiene una convención de nomenclatura que transmita esa información.

debe utilizar el puntero cuando este:

  • Volviendo al objeto actual.
  • La creación de relaciones entre objetos (que pasan this en un constructor o colocador)
  • Comprobación de autorreferencia: this != argPtr
6

Sólo recuerdo hacerlo con

delete this; 
+4

Esa línea es un poco aterradora. Por otra parte, recuerdo haber tenido que hacer 'if (this == null)' antes para ayudar a rastrear algún error extraño. – Herms

+0

Lo usé una o dos veces en mi código también. Ph34r m3! :) – Eugene

+0

Esta es una práctica estándar en entornos contados por referencia como COM. –

2

Para mí, depende Si es una función o variable corta, simplemente la escribo (por ejemplo, mCount). La mayoría de las veces, sin embargo, uso nombres de funciones y variables de miembros muy descriptivos (por ejemplo, mExclusivelyLockedDigitalIOList). En esos casos, tiendo a usar este puntero para que el IntelliSense de Visual Studio termine de escribirme. Guarda las pulsaciones de teclas y errores de ortografía.

Cuestiones relacionadas