Что означает " оператор 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;
};