2014-01-31 8 views
16

Ich lerne immer noch über C++ und ich lese überall, dass ich const verwenden muss, wo ich kann (aus Gründen der Geschwindigkeit denke ich).C++ const in Getter

ich in der Regel meine Getter-Methode wie folgt schreiben:

const bool isReady() { 
    return ready; 
} 

Aber ich habe, dass auf diese Weise einige IDE autogenerate Getter gesehen:

bool getReady() const { 
    return ready; 
} 

Aber die Delegierten zu schreiben, es passiert mir diesen Fehler zu finden, wenn die const nach der Funktion ist: So

member function 'isReady' not viable: 'this' argument has type 'const VideoReader', but function is not marked const 

das, was ist der bessere Weg, um einen konstanten Getter zu schreiben? Muss ich mich wirklich darum kümmern?

+0

In Bezug auf Booleans schien diese Frage ein wenig albern. Ich fand jedoch eine großartige Erklärung von const bei dieser Frage: http://StackOverflow.com/questions/5503352/const-before-or-const-after – hubatish

Antwort

33

Es gibt einen großen Unterschied zwischen den beiden Möglichkeiten.

const bool isReady() 

Der obige Code wird eine const bool zurück, aber es garantiert nicht, dass das Objekt Zustand seiner Logik wird sich nicht ändern.

bool isReady() const 

Dies wird eine bool, zurückkehren und es wird sichergestellt, dass der logische Zustand des Objekts wird sich nicht ändern. In diesem Fall ist es nicht notwendig, vor dem Rückgabetyp const zu schreiben. Es macht keinen Sinn, eine const bool zurückzugeben, weil es sowieso eine Kopie ist. Also macht es const unbrauchbar. Die zweite const wird für const correctness benötigt, die nicht aus Geschwindigkeitsgründen verwendet wird, sondern um Ihr Programm zuverlässiger und sicherer zu machen.

+4

"Sie sollten wirklich darüber lesen" können Sie mir einige Links zur Verfügung stellen? – nkint

+3

@nkint: z. Effektives C++ von Scott Meyers oder Exceptional C++ von Herb Sutter. Hier ist der alte http://www.gotw.ca/gotw/006.htm und für C++ 11 wurde das sogar noch wichtiger. http://herbsutter.com/2013/05/24/gotw-6a-const-correctness-part-1-3/ – mkaes

+0

Ich denke nicht, dass dies die beste Antwort in Bezug auf die Erklärung des Problems ist, aber die Links sind sehr gut! – nkint

2

A const Getter hat die Signatur

bool getReady() const 

Die andere Version ist kein const Methode, gibt sie nur einen const Wert (die im Grunde unbrauchbar).

eine const Getter ermöglicht es Ihnen, es auf const Objekte zu nennen:

const Object obj; 
obj.getReady(); 

Dies gilt nur, wenn getReady als const markiert.

19

Sie bedeuten zwei differnt Dinge:

const bool isReady() { 
    return ready; 
} 

Dies gibt eine Konstante Bool. Dies bedeutet, dass ein Bool den Wert nicht vom Zeitpunkt der Erstellung ändern kann.

Dies ist eine konstante Funktion, dh eine Funktion, die keine Elementvariablen der Klasse ändert, zu der sie gehört. Dies ist der Stil, der für Getter empfohlen wird, da deren einziger Zweck das Abrufen von Daten ist und in diesem Prozess nichts geändert werden sollte.

2

Es gibt einen Unterschied zwischen der Verwendung des const Schlüsselwort für den Rückgabetyp oder für die Methodensignatur. Im ersten Fall ist der zurückgegebene Wert ein konstanter Wert. Im zweiten Fall wird die Methode eine sogenannte konstante Methode sein, die die Repräsentation des Objekts nicht ändern kann.Bei konstanten Objekten sind nur die Konstantenmethoden aufrufbar.

5

const Methode informiert Compiler, dass Sie nicht Klasseninstanz ändern, auf denen diese Methode aufgerufen wird:

class A { 
public: 
bool getReady() const { 
    return ready; 
} 
}; 

also, wenn Sie versuchen, Ihr Objekt innerhalb getReady() zu ändern, dann werden Compiler-Fehler ausgeben. Const-Methoden sind nützlich, wenn Sie zB: const A & oder const A * haben, dann können Sie nur const-Methoden für solche Objekte aufrufen.

wie:

const bool isReady() { 
    return ready; 
} 

diese const bietet eigentlich keinen wirklichen Nutzen, weil Bool während isReady() zurückkehrt kopiert wird. Solch const würde Sinn ergeben, wenn der zurückgegebene Typ ein const char* oder const A& wäre, in solchen Fällen const macht Ihre Char-Zeichenfolge oder A-Klasseninstanz unveränderlich.