Frage

Ein Kommentar zu einem meiner Beiträge interessiert mich:

  

Me too . Ich gebe auch Accessoren / Mutatoren die gleichen Namen.

Ich frage mich darüber, weil ich immer setBar(int bar) anstelle eines Mutator genannt dasselbe verwendet haben. Ich will wissen: Der Compiler kann auf einer const Kennung, welche mutiert zur Laufzeit bestimmt, basiert, oder es kann die gleichen Funktionsnamen verwenden, da es einen Parameter hat

Wird diese kompilieren fein:

class Foo
{
   int bar_;

   public:
      int bar() { return bar_; }
      void bar(int bar) { bar_ = bar; }
}

Oder muss ich dies tun (Ich weiß, sollte ich sowieso tun dies sein, nur mit mir zu diesem Thema laufen):

int bar() const { return bar_; }

Ich weiß nicht, was was ist. Konst Korrektheit ist wichtig, so glaube ich, der Compiler, da man mutiert zum Überlastung zu widersprechen möchte und man dies nicht tut.

Warum es auf diese Weise funktioniert?

War es hilfreich?

Lösung

Das erste, was der Compiler an aussieht, ist die Anzahl und Art der Parameter an die Funktion, die Sie vorbei. Dies löst die Überlastung bar, bevor es selbst bei const-ness aussehen muss.

Wenn Sie nicht bar() als const markieren, wird die Compiler Sie darüber informiert Sie das erste Mal versuchen, bar() auf einer const Instanz des Objekts zu nennen.

Andere Tipps

Der Compiler wird verhindert, dass Sie nicht aus einer nicht-const Member-Funktion zu schreiben, die in der Tat das Objekt nicht mutieren. Das ist kein Verstoß gegen const-Korrektheit, die nur gewährleistet, dass Objekte nicht über const Referenzen mutiert. Das Prinzip dabei ist, dass const sagt die Funktion nicht mutieren kann, und nicht konstante bedeutet, dass die Funktion frei mutieren, wenn es will. Es gibt keine Möglichkeit, mutieren zu versprechen, und haben die Compiler, dass erzwingen. Ich denke, das auch wäre vage eine Garantie von Nutzen für Anrufer sein

Wie Greg sagt, wird der Compiler-Objekt, wenn Sie versuchen, eine nicht-const Member-Funktion auf ein konstantes Objekt zu nennen (wieder, es ist unerheblich, ob es in der Tat mutiert. Das einzig Wichtige ist, ob es deklariert ist const).

Zum leichteren Verständnis der Ansicht, dass Compiler geht davon aus, dass ein Objekt geändert wird, wenn eine nicht-const-Methode wird für das Objekt aufgerufen werden.

So in einer const-Methode, wenn Sie eine nicht-const-Methode für eines der Datenelemente oder ein anderes nicht-const-Methode der Klasse aufrufen, wird der Compiler einen Fehler signalisieren.

Sie können Operatoren als Methoden prüfen, wie gut (ich weiß, können Sie einige Operatoren als Freund Funktionen definieren, nicht als Methoden, aber für simplifcation ...). Zum Beispiel ist der Zuweisungsoperator (operator =) standardmäßig nicht-const. Das heißt, wenn Sie etwas tun, wie

void MyClass::MyConstMethod() const
{
   classMember = value;
}

Der Compiler wird bedenken, dass Sie den Zuweisungsoperator von classMember genannt, die im Innern eine konstante Methode ein konstantes Objekt ist. Da operator = nicht const, wird ein Compiler-Fehler gemeldet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top