Beispielsweise:
operator bool() const
{
return col != 0;
}
col
ist ein int. Wie funktioniert das operator bool() const
?
Beispielsweise:
operator bool() const
{
return col != 0;
}
col
ist ein int. Wie funktioniert das operator bool() const
?
Mitgliedsfunktionen des Formulars
operator TypeName()
sind Konvertierungsoperatoren. Sie ermöglichen die Verwendung von Objekten des Klassentyps, als wären sie vom Typ, TypeName
und wenn sie es sind, werden sie TypeName
mithilfe der Konvertierungsfunktion konvertiert .
In diesem speziellen Fall operator bool()
kann ein Objekt des Klassentyps so verwendet werden, als wäre es ein bool
. Wenn Sie beispielsweise ein Objekt des Klassentyps benannt haben obj
, können Sie es als verwenden
if (obj)
Dies ruft das auf operator bool()
, gibt das Ergebnis zurück und verwendet das Ergebnis als Bedingung für das if
.
Es sollte beachtet werden, dass dies operator bool()
eine sehr schlechte Idee ist und Sie sie wirklich niemals verwenden sollten. Eine ausführliche Erklärung, warum es schlecht ist, und eine Lösung für das Problem finden Sie unter "The Safe Bool Idiom".
(C ++ 0x, die bevorstehende Überarbeitung des C ++ - Standards, bietet Unterstützung für explizite Konvertierungsoperatoren. Auf diese Weise können Sie einen Safe schreiben explicit operator bool()
, der ordnungsgemäß funktioniert, ohne durch die Implementierung der Safe Bool-Redewendung springen zu müssen.)
bool
) ist, können Sie ihm keinen Wert zuweisen. Wenn es sich um einen veränderbaren Wert handelt (z. B.bool&
), können Sie ihn zuweisen. In Bezug auf die Korrektheit argumentiere ich, dass aoperator bool()
immer falsch ist, weil es die Verwendung eines Objekts vom Klassentyp in einer Vielzahl von Situationen ermöglicht, in denen Sie es niemals verwenden möchten. Safe Bool ist eine weit überlegene Alternative.explicit operator bool()
. Verstehe ich richtig?Definiert, wie die Klasse in einen booleschen Wert konvertierbar ist.
const
Nach dem()
, mit dem angegeben wird, dass diese Methode nicht mutiert (ändern Sie die Mitglieder dieser Klasse).Normalerweise verwenden Sie solche Operatoren wie folgt:
quelle
Ich würde gerne mehr Codes geben, um es klar zu machen.
quelle
Es ist eine benutzerdefinierte
implicit
Konvertierungsfunktion, mit der Sie Ihre Klasse in entwedertrue
oder konvertieren könnenfalse
.quelle
Es ist eine implizite Konvertierung zu
bool
. Das heißt, wo immer implizite Konvertierungen zulässig sind, kann Ihre Klassebool
durch Aufrufen dieser Methode konvertiert werden.quelle
Wie die anderen gesagt haben, ist es für die Typkonvertierung, in diesem Fall in a
bool
. Beispielsweise:Jetzt kann ich ein Objekt dieser Klasse so verwenden, als wäre es ein Boolescher Wert:
quelle
Beim Schreiben meines eigenen unique_ptr habe ich diesen Fall gefunden. Gegeben
std::unique_ptr
istoperator==
:Und dieser Testfall von libstdcxx :
Beachten Sie, dass
ptr
das ein hatexplicit operator bool() const noexcept;
, also hier gutoperator overload resolution
funktioniert, zBptr == 0
wähltWenn es keine hat
explicit
Schlüsselwort hier,ptr
inptr == 0
wird in umgewandelt werdenbool
, dannbool
wird in umgewandelt werdenint
, dabool operator==(int, int)
ist eingebaut und0
istint
. Was auf uns wartet, ist ein mehrdeutiger Überlastungsauflösungsfehler.Hier ist ein minimales, vollständiges und überprüfbares Beispiel :
gcc :
klirren :
quelle
Eine weitere häufige Verwendung besteht darin, dass Standardcontainer einen Gleichheitsvergleich für Schlüsselwerte in benutzerdefinierten Objekten durchführen
quelle
operator ()
nichtoperator bool
. Sie sind völlig anders.operator ()
ist der Aufrufoperator, so dass aComparer
als Funktion aufgerufen werden kann. Dasoperator ()
kehrt einfach zurückbool
, aber das macht es nicht dasselbe wieoperator bool
, was einfach eine implizite Besetzung ermöglichtbool
.