Quelle est la signification de “opérateur bool () const”

Par exemple:

operator bool() const { return col != 0; } 

col est un int. Comment fonctionne l’ operator bool() const ?

Fonctions membres du formulaire

 operator TypeName() 

sont des opérateurs de conversion. Ils permettent aux objects du type de classe d’être utilisés comme s’ils étaient de type TypeName et quand ils le sont, ils sont convertis en TypeName utilisant la fonction de conversion.

Dans ce cas particulier, l’ operator bool() permet à un object du type de classe d’être utilisé comme un bool . Par exemple, si vous avez un object du type de classe nommé obj , vous pouvez l’utiliser comme

 if (obj) 

Cela appellera l’ operator bool() , retournera le résultat et utilisera le résultat comme condition du if .

Il convient de noter que l’ operator bool() est une très mauvaise idée et que vous ne devriez jamais l’utiliser. Pour une explication détaillée de la raison pour laquelle il est mauvais et pour la solution du problème, voir “The Safe Bool Idiom”.

(C ++ 0x, la prochaine révision du standard C ++, ajoute la prise en charge des opérateurs de conversion explicite. Ils vous permettront d’écrire un explicit operator bool() sécurisé explicit operator bool() qui fonctionne correctement sans avoir à passer par l’implémentation de Safe Bool Idiom .)

 operator bool() const { return col != 0; } 

Définit comment la classe est convertible en une valeur booléenne, le const après le () est utilisé pour indiquer que cette méthode ne mute pas (changez les membres de cette classe).

Vous utiliseriez généralement ces opérateurs comme suit:

 airplaysdk sdkInstance; if (sdkInstance) { std::cout << "Instance is active" << std::endl; } else { std::cout << "Instance is in-active error!" << std::endl; } 

Je voudrais donner plus de codes pour le rendre clair.

 struct A { operator bool() const { return true; } }; struct B { explicit operator bool() const { return true; } }; int main() { A a1; if (a1) cout << "true" << endl; // OK: A::operator bool() bool na1 = a1; // OK: copy-initialization selects A::operator bool() bool na2 = static_cast(a1); // OK: static_cast performs direct-initialization B b1; if (b1) cout << "true" << endl; // OK: B::operator bool() // bool nb1 = b1; // error: copy-initialization does not consider B::operator bool() bool nb2 = static_cast(b1); // OK: static_cast performs direct-initialization } 

C’est la fonction de conversion implicit définie par l’utilisateur pour convertir votre classe en true ou en false .

 //usage bool value = yourclassinstance; //yourclassinstance is converted into bool! 

C’est une conversion implicite en bool . C’est-à-dire que chaque fois que des conversions implicites sont autorisées, votre classe peut être convertie en bool en appelant cette méthode.

Comme les autres l’ont dit, c’est pour la conversion de type, dans ce cas-ci pour un bool . Par exemple:

 class A { bool isItSafe; public: operator bool() const { return isItSafe; } ... }; 

Maintenant, je peux utiliser un object de cette classe comme si c’était un booléen:

 A a; ... if (a) { .... } 

Une autre utilisation courante est que les conteneurs std effectuent une comparaison d’égalité sur les valeurs de clé à l’intérieur des objects personnalisés.

 class Foo { public: int val; }; class Comparer { public: bool operator () (Foo& a, Foo&b) const { return a.val == b.val; }; class Blah { std::set< Foo, Comparer > _mySet; };