Wenn möglich, ist es besser, Datenelemente über die Initialisiererliste zu setzen, In diesem Fall gibt es kein Problem mit Argumenten, die die Membernamen überschatten. Eine weitere Alternative ist die Verwendung von this->foo = foo;
im Body des Konstruktors. Ein ähnliches Problem besteht für Setter, aber jetzt können Sie die Initialisiererlistenlösung nicht mehr verwenden. Sie stecken fest mit this->foo = foo;
- oder einfach andere Namen für Argumente und Mitglieder.
Einige Leute hassen Argumente, die Datenmitglieder schatten; Mehrfache Kodierungsstandards sagen explizit, dies nie zu tun. Andere denken, dass diese Art von Beschattung, zumindest für Konstrukteure und Setter, das Miauen der Katze ist. Ich erinnere mich an das Lesen von ein oder zwei Codierungsstandards (aber ich erinnere mich nicht daran), die diese Art von Shadowing als "sollte" (aber nicht "soll") praktizieren.
Eine letzte Option besteht darin, Shadowing in der Funktionsdeklaration zu verwenden, um Lesern einen Hinweis darauf zu geben, was die Funktion macht, aber unterschiedliche Namen in der Implementierung zu verwenden.
Update: Was ist "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);
}
Die innerste Erklärung i
, int i=10
, shadows die Variable i
in der for
Anweisung deklariert, was wiederum die Variable i
bei Funktionsumfang erklärt Schatten, die wiederum i
die globale Variable Schatten.
Im Problem auf der Hand, die Argumente x
, y
, width
und height
auf den Nicht-Standard-Konstruktor für die Klasse A
Schatten der Mitgliedsdaten mit den gleichen Namen wie die Argumente.
Ihre width=width;
hat nichts getan, weil das Argument width
das Datenelement width
schattiert (versteckt). Wenn Sie zwei oder mehr Variablen mit demselben Namen haben, die in verschiedenen Bereichen deklariert wurden, ist der Gewinner immer der Name mit dem innersten Gültigkeitsbereich. Im Allgemeinen gewinnt immer der Name mit dem innersten Umfang.
Euh, Anhängen eines 'a' an die Argumentnamen? –
'A :: A (int xa, int ya, int widtha, int höhe)' – corazza
Wenn Sie elegant sein wollen, * pred * pendieren Sie das 'a' und bilden Sie einen unbestimmten englischen Artikel:' anX, aY, aWidth, aHaight' usw. Offensichtlich kann derselbe Bezeichner nicht verwendet werden, um auf zwei verschiedene Variablen im selben Bereich zu verweisen. Siehe meine Antwort. –