Initialisatorlisten in Konstruktoren: Überlappende Namen mit Mitgliedsvariablen
Die Praxis, Mitgliedsvariablen mit denselben Namen wie Konstruktorargumente zu initialisieren, hat Fragen aufgeworfen über die Gültigkeit und Einhaltung der C-Standards. Lassen Sie uns die Perspektive des Standards auf diese Praxis untersuchen.
Gemäß dem C-Standard §12.6.2/7 werden die Ausdrücke in der Ausdrucksliste eines Mitgliedsinitialisierers im Rahmen des Konstruktors ausgewertet. Daher ist die Verwendung desselben Namens sowohl für ein Konstruktorargument als auch für eine Mitgliedsvariable ausdrücklich zulässig.
Zum Beispiel ist das folgende Codefragment vollständig mit dem C-Standard kompatibel:
class Blah { std::vector<int> vec; public: Blah(std::vector<int> vec): vec(vec) {} // ... };
In In diesem Fall wird das Konstruktorargument vec verwendet, um die Mitgliedsvariable vec ohne Mehrdeutigkeit zu initialisieren.
Darüber hinaus erlaubt der Standard die Verwendung von Der This-Zeiger in Member-Initialisierern, um auf das Objekt zu verweisen, das initialisiert wird. Dies ermöglicht die Initialisierung von Mitgliedsvariablen basierend auf anderen Mitgliedsvariablen, wie im folgenden Beispiel gezeigt:
class X { int a; int b; int i; int j; public: X(int i): r(a), b(i), i(i), j(this->i) {} // ... };
Es ist jedoch zu beachten, dass die Übergabe des Konstruktorparameters als konstante Referenz die Effizienz des Codes verbessern kann, indem vermieden wird unnötiges Kopieren des ursprünglichen Vektorobjekts. Dies kann erreicht werden, indem der Konstruktor wie folgt geändert wird:
Blah(const std::vector<int> &vec): vec(vec) {}
Das obige ist der detaillierte Inhalt vonDürfen sich die Namen von Konstruktorargumenten und Mitgliedsvariablen in C überschneiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!