Например:
operator bool() const
{
return col != 0;
}
col
- это int.
Как работает operator bool() const
?
Например:
operator bool() const
{
return col != 0;
}
col
- это int.
Как работает operator bool() const
?
Функции-члены формы
operator TypeName()
- операторы преобразования. Они позволяют использовать объекты типа класса, как если бы они были типа TypeName
, а когда они есть, они преобразуются в TypeName
с помощью функции преобразования.
В этом конкретном случае operator bool()
позволяет использовать объект типа класса, как если бы он был bool
. Например, если у вас есть объект типа класса с именем obj
, вы можете использовать его как
if (obj)
Это вызовет operator bool()
, вернет результат и будет использовать результат как условие if
.
Следует отметить, что operator bool()
- это очень плохая идея, и вы никогда не должны ее использовать. Подробное объяснение того, почему это плохо, и для решения проблемы, см. "Идиома безопасного була."
(С++ 0x, предстоящая ревизия стандарта С++, добавляет поддержку явным операторам преобразования, что позволит вам написать безопасный explicit operator bool()
, который работает правильно, не перепрыгивая через обручи реализации Safe 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;
};