542 Stimmen

Verwendung von 'const' für Funktionsparameter

Wie weit gehen Sie mit const ? Machen Sie einfach Funktionen const wenn es nötig ist, oder gehen Sie aufs Ganze und verwenden es überall? Stellen Sie sich zum Beispiel einen einfachen Mutator vor, der einen einzigen booleschen Parameter annimmt:

void SetValue(const bool b) { my_val_ = b; }

Ist das const tatsächlich nützlich? Ich persönlich entscheide mich dafür, es ausgiebig zu nutzen, einschließlich der Parameter, aber in diesem Fall frage ich mich, ob es sich lohnt?

Ich war auch überrascht zu erfahren, dass man die const von Parametern in einer Funktionsdeklaration, sondern kann sie in die Funktionsdefinition aufnehmen, z. B.:

.h-Datei

void func(int n, long l);

.cpp-Datei

void func(const int n, const long l)

Gibt es dafür einen Grund? Es erscheint mir ein wenig ungewöhnlich.

9voto

Ich sage: Halten Sie Ihre Werteparameter ein.

Betrachten Sie diese fehlerhafte Funktion:

bool isZero(int number)
{
  if (number = 0)  // whoops, should be number == 0
    return true;
  else
    return false;
}

Wenn der Parameter number const wäre, würde der Compiler anhalten und uns vor dem Fehler warnen.

6voto

user541686 Punkte 196656

Wenn Sie die ->* o .* Betreiber, das ist ein Muss.

Es verhindert, dass Sie etwas schreiben können wie

void foo(Bar *p) { if (++p->*member > 0) { ... } }

was ich gerade fast getan hätte, und was wahrscheinlich nicht das bewirkt, was Sie beabsichtigen.

Was ich sagen wollte, war

void foo(Bar *p) { if (++(p->*member) > 0) { ... } }

und wenn ich eine const zwischendurch Bar * y p hätte mir der Compiler das gesagt.

5voto

Dan Hewett Punkte 2160

Const ist sinnlos, wenn das Argument als Wert übergeben wird, da Sie das Objekt des Aufrufers nicht ändern werden.

const sollte bei der Übergabe per Verweis bevorzugt werden, es sei denn, der Zweck der Funktion ist es, den übergebenen Wert zu ändern.

Schließlich kann und sollte eine Funktion, die das aktuelle Objekt (this) nicht verändert, als const deklariert werden. Ein Beispiel ist unten:

int SomeClass::GetValue() const {return m_internalValue;}

Dies ist ein Versprechen, das Objekt, auf das dieser Aufruf angewendet wird, nicht zu verändern. Mit anderen Worten, Sie können aufrufen:

const SomeClass* pSomeClass;
pSomeClass->GetValue();

Wäre die Funktion nicht konstant, würde dies zu einer Compilerwarnung führen.

5voto

Nemanja Trifunovic Punkte 23869

Ah, eine schwierige Frage. Auf der einen Seite ist eine Deklaration ein Vertrag und es macht wirklich keinen Sinn, ein const-Argument als Wert zu übergeben. Andererseits, wenn man sich die Funktionsimplementierung ansieht, gibt man dem Compiler mehr Möglichkeiten zur Optimierung, wenn man ein Argument als konstant deklariert.

5voto

Lloyd Punkte 22223

Die Kennzeichnung von Wertparametern als "const" ist definitiv eine subjektive Angelegenheit.

Ich ziehe es jedoch vor, Wertparameter als const zu kennzeichnen, so wie in Ihrem Beispiel.

void func(const int n, const long l) { /* ... */ }

Der Wert liegt für mich darin, dass klar angegeben wird, dass die Werte der Funktionsparameter niemals durch die Funktion geändert werden. Sie haben am Anfang den gleichen Wert wie am Ende. Für mich gehört das zu einem sehr funktionalen Programmierstil.

Bei einer kurzen Funktion ist es wohl eine Zeit- und Platzverschwendung, das "const" dort zu haben, da es normalerweise ziemlich offensichtlich ist, dass die Argumente nicht durch die Funktion geändert werden.

Bei einer größeren Funktion handelt es sich jedoch um eine Form der Implementierungsdokumentation, die vom Compiler erzwungen wird.

Ich kann sicher sein, dass ich, wenn ich eine Berechnung mit 'n' und 'l' durchführe, diese Berechnung umgestalten/verschieben kann, ohne befürchten zu müssen, dass ich ein anderes Ergebnis erhalte, weil ich eine Stelle übersehen habe, an der eine oder beide Änderungen vorgenommen wurden.

Da es sich um ein Implementierungsdetail handelt, brauchen Sie die Wertparameter nicht als const im Header zu deklarieren, so wie Sie auch die Funktionsparameter nicht mit denselben Namen deklarieren müssen, die die Implementierung verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X