Что означает " оператор bool () const"
например:
operator bool() const
{
return col != 0;
}
col
является int.
Как это operator bool() const
работы?
7 ответов
функции-члены формы
operator TypeName()
операторы преобразования. Они позволяют использовать объекты типа class, как если бы они были типа TypeName
и когда они есть, они преобразуются в TypeName
использование функции преобразования.
в данном случае operator bool()
позволяет использовать объект типа класса, как если бы он был bool
. Например, если у вас есть объект типа класса с именем obj
, вы можете использовать его as
if (obj)
этой operator bool()
, верните результат и используйте результат в качестве условия if
.
следует отметить, что operator bool()
Это очень плохая идея, и вы никогда не должны ее использовать. Для подробного объяснения того, почему это плохо, и для решения проблемы см. "Безопасного Типа Bool Идиома."
(C++0x, предстоящая редакция стандарта C++, добавляет поддержку явных операторов преобразования. Эти позволит вам написать сейф explicit operator bool()
это работает правильно, без необходимости прыгать через обручи реализации безопасной идиомы Bool.)
operator bool() const
{
return col != 0;
}
определяет, как класс преобразуется в логическое значение const
после ()
используется для указания, что этот метод не мутирует (изменяет члены этого класса).
вы обычно используете такие операторы следующим образом:
airplaysdk sdkInstance;
if (sdkInstance) {
std::cout << "Instance is active" << std::endl;
} else {
std::cout << "Instance is in-active error!" << std::endl;
}
Я хотел бы дать больше кодов, чтобы сделать это ясно.
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<bool>(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<bool>(b1); // OK: static_cast performs direct-initialization
}
это определяется пользователем implicit
функция преобразования для преобразования вашего класса в любой true
или false
.
//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!
это неявное преобразование к bool
. Т. е. везде, где разрешены неявные преобразования, ваш класс может быть преобразован в bool
вызывая этот метод.
как говорили другие, это для преобразования типов, в данном случае в bool
. Например:
class A {
bool isItSafe;
public:
operator bool() const
{
return isItSafe;
}
...
};
Теперь я могу использовать объект этого класса, как если бы он был логическим:
A a;
...
if (a) {
....
}
другое общее использование для контейнеров std для сравнения равенства по ключевым значениям внутри пользовательских объектов
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;
};