Heim >Backend-Entwicklung >C++ >Dürfen sich die Namen von Konstruktorargumenten und Mitgliedsvariablen in C überschneiden?

Dürfen sich die Namen von Konstruktorargumenten und Mitgliedsvariablen in C überschneiden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-12 21:49:01562Durchsuche

Are Constructor Argument and Member Variable Names Allowed to Overlap in C  ?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn