2009-10-19 5 views

Antwort

8

Es ist nur eine bequeme Namenskonvention, es bedeutet nichts für die Sprache. Seien Sie sicher, dass Sie nicht mit einem Großbuchstaben folgen: What does double underscore (__const) mean in C?

+2

Siehe auch: http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier/228797#228797 –

+0

@Martin: Danke, ich mag Ihre Link noch besser. –

+1

Ich vermeide es, Unterstriche ganz zu führen, nur damit ich nicht das "nicht mit einem Großbuchstaben" -Bit erklären muss. –

1

Sie sind nur Namen für übergebene Parameter. Sie entsprechen den Elementvariablen und werden für Initialisierer verwendet.

Es gibt keine besondere Bedeutung - es ist nur eine Konvention, die einige Leute verwenden können.

9

Nichts besonderes. Er nannte es einfach so, um zwischen den Elementvariablen und Parameternamen zu unterscheiden.

Underscore ist ein gültiges Zeichen in C++ - Bezeichnern.

+1

Auch normalerweise haben die Member-Variablen Unterstrich res nach Konvention und die Konstruktorargumente nicht. Es ist jedoch wirklich die lokale Codierungskonvention. Einige Geschäfte benötigen "m_" vor Mitgliedern. Bleiben Sie jedoch von doppelten Unterstrichen fern (reserviert für den Compiler). siehe: http://stackoverflow.com/questions/1228161/why-use-prefixes-on-member-variables-in-cc-klassen – bluehavana

+3

Ich habe genug Code gesehen, um zu sagen, dass nichts in den Namen von privaten Mitgliedern, viel weniger Unterstreichungen, sind konventionell. – coppro

+2

Beachten Sie auch, dass diese Unterscheidung in einem ctor-Initialisierer nicht unbedingt erforderlich ist - der Namens-Lookup für Mitglieder findet nur Member, und der Namens-Lookup im Initialisierer findet zuerst den Parameternamen. – coppro

0

Sie haben keine syntaktische Bedeutung. Wenn Sie jedoch eine Reihe von Feldern haben (z. B. x, y, width und height), ist es eine gängige Konvention, die Konstruktorparameter zu benennen, die sie mit dem Feldnamen plus einem führenden Unterstrich initialisieren.

0

Der Zweck dieser Unterstriche besteht darin, die Parametervariable float _x und die Elementvariable float x zu unterscheiden. Syntaktisch wird aufgrund der Unterstriche keine besondere Bedeutung hinzugefügt. Ich persönlich bevorzuge es, alle Parameter mit a_ voranzutreiben und alle Mitgliedsvariablen mit m_ als Präfix zu versehen, wenn ich C++ programmieren muss.

Wenn ich also in eine Situation komme, wo ich lokale, member und Parametervariablen mischen und abgleichen muss, weiß ich, mit welchen ich es zu tun habe.

int y = a_x * 2; 
m_x = y + 3; 
8

Höchstwahrscheinlich versuchte der Autor des Codes, den potenziellen Konflikt zwischen den Datenelementnamen und Konstruktorparametern in der Initialisierungsliste zu vermeiden. Sehr wahrscheinlich war sich der Autor nicht bewusst, dass C++ - Lookup-Regeln sicherstellen, dass der Konflikt sowieso nicht auftritt. I.e. Der folgende Code wird auch die erwarteten Ergebnisse

produzieren, obwohl es für einen unvorbereiteten Leser möglicherweise verwirrend erweisen könnte.

Natürlich werden Parameternamen innerhalb des Rumpfs des Konstruktors die Elementnamen verbergen, so dass es notwendig ist, this->... oder qualifizierte Namen für den Zugriff auf die Datenelemente zu verwenden. Es besteht die Möglichkeit, dass der Autor des Codes dies ebenfalls vermeiden wollte.

+0

Interessant, kannte diesen Leckerbissen nicht. In meinen Augen wäre es jedoch besser, Parameternamen zu verwenden, die nicht mit den Namen der Mitgliedsvariablen übereinstimmen. In diesem Fall können Sie x und y als Parameter im ctor verwenden, aber wenn Sie die Methoden setX und setY schreiben, müssten Sie verschiedene Parameternamen verwenden. Ich bevorzuge es, meine Parameternamen in einer Klasse einheitlich zu halten. – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot: Nicht unbedingt. Mit der 'this-> member'-Syntax können Sie Ihre' setX'- und 'setY'-Methoden implementieren, selbst wenn die Parameternamen die Elementnamen verbergen. Einige Codierungsstandards erfordern tatsächlich, dass auf Klassenmitglieder immer über die "this -> member" -Syntax zugegriffen wird (es gibt einen gewissen Wert darin, ich muss zugeben). – AnT

+0

@AndreyT: Sie machen einen guten Punkt. Bei konsequenter Verwendung ist die This-Member-Syntax sehr klar (ich habe dieses Format in vielen Java-Klassen gesehen). Was passiert jedoch, wenn Sie den "this ->" Teil vergessen? Ich bin mir nicht sicher, was das Verhalten ist, aber ich stelle mir vor, dass dies häufig bei großen Projekten passiert. Selbst wenn nichts Gruseliges passiert, würde mich die Inkonsistenz im Code stören (ich nehme hier eine Nit). – ThisSuitIsBlackNot

0

, wenn Sie den float x, float y usw. nennen würden, könnten Sie nicht auf die tatsächlichen Felder der Klasse zugreifen, da sie denselben Namen haben.

es hat nichts mit der Sprache zu tun, es ist nur eine Konvention durch die tatsächlichen Programmierer (auf den Code deutlicher zu machen, glaube ich)

2

Diese nur Konvention von Variablennamen sind, dass verschiedene Menschen/Institutionen übernehmen. Dies mag auf den ersten Blick unnötig erscheinen, ist aber sehr nützlich beim Lesen und Schreiben von Code, insbesondere wenn Sie Parameter und Member-Variablen haben, die denselben Namen haben. Z.B.Sie können diese drei Fälle häufig haben:

class A { 
    void foo(int age_) { //parameter 
    int age = 18; //local scope 
    if (age_ > age) cout << legal << endl; 
    } 
    int _age; //member 
}; 

Im obigen Beispiel:

  • _variable - bedeutet dies eine Klasse Membervariable ist
  • Variable_ - bedeutet dies ein Parameter einer Funktion ist
  • Variable - bedeutet, dies ist nur eine reguläre Variable lokal für den Funktionsumfang
+0

und _Variable tress wird auf den Namespace des Implementierers übergeben. –