Si es posible, es mejor fijar los miembros de datos a través de la lista de inicialización, en cuyo caso no hay problema con los argumentos que sombrean los nombres de los miembros. Otra alternativa es usar this->foo = foo;
en el cuerpo del constructor. Existe un problema similar para los instaladores, pero ahora no puede usar la solución de la lista de inicializadores. Estás atrapado con this->foo = foo;
- o simplemente usa diferentes nombres para argumentos y miembros.
Algunas personas realmente odian los argumentos que ocultan a los miembros de datos; múltiples estándares de codificación explícitamente dicen nunca hacer esto. Otros piensan que este tipo de sombreado, al menos para los constructores y setters, es el maullido del gato. Recuerdo leer uno o dos estándares de codificación (pero no recuerdo cuál) que designaron a este tipo de ocultamiento como una práctica de "debería" (pero no "deberá").
Una última opción es usar el sombreado en la declaración de función para dar a los lectores una pista sobre lo que hace la función, pero use nombres distintos en la implementación.
Actualización: ¿Qué es "shadowing"?
#include <iostream>
void printi (int i) { std::cout << "i=" << i << "\n"; }
int i = 21;
int main() {
printi (i);
int i = 42;
printi (i);
for (int i = 0; i < 3; ++i) {
printi (i);
int i = 10;
printi (i);
}
printi (i);
}
La declaración más interna de i
, int i=10
, sombras i
la variable declarada en la declaración for
, que a su vez las sombras de la variable i
declarado en ámbito de la función, que a su vez las sombras de la variable global i
.
En el problema en cuestión, los argumentos x
, y
, width
, y height
al constructor no predeterminado para la clase A
sombra los datos de los miembros con los mismos nombres que los argumentos.
Su width=width;
no hizo nada porque el argumento width
sombrea (oculta) el miembro de datos width
. Cuando tiene dos o más variables con el mismo nombre que se declararon en diferentes ámbitos, el ganador siempre es el nombre con el alcance más interno. En general, siempre gana el nombre con el alcance más interno.
Euh, agregando un 'a' a los nombres de los argumentos? –
'A :: A (int xa, int, int widtha, int heighta)' – corazza
si quiere ser elegante, * pre * pend the 'a', formando un artículo indefinido en inglés:' anX, aY, aWidth, aHaight' etc. Obviamente, el mismo identificador no puede utilizarse para referirse a dos variables diferentes en el mismo ámbito. Ver mi respuesta –