Например:Что значит "оператор BOOL() сопзЬ"
operator bool() const
{
return col != 0;
}
col
является внутр. Как работает operator bool() const
?
Например:Что значит "оператор BOOL() сопзЬ"
operator bool() const
{
return col != 0;
}
col
является внутр. Как работает operator bool() const
?
функции члены вида
operator TypeName()
операторы преобразования. Они позволяют использовать объекты типа класса, как если бы они были типа TypeName
, и когда они есть, они преобразуются в с использованием функции преобразования.
В данном конкретном случае operator bool()
позволяет использовать объект типа класса, как если бы он был bool
. Например, если у вас есть объект типа класса с именем obj
, вы можете использовать его как
if (obj)
Это будет вызывать operator bool()
, возвращает результат, и использовать результат как состояние if
.
Следует отметить, что operator bool()
- это очень плохая идея, и вы никогда не должны ее использовать. Подробное объяснение того, почему это плохо и для решения проблемы, см. "The Safe Bool Idiom."
(C++ 0x, предстоящая ревизия стандарта C++, добавляет поддержку явных операторов преобразования, что позволит вам напишите сейф explicit operator bool()
, который работает правильно, без необходимости перепрыгивать через обручи реализации Idoom Safe Bool.)
Это неявное преобразование в bool
. То есть везде, где допускаются неявные преобразования, ваш класс может быть преобразован в bool
, вызвав этот метод.
Он определен пользователем implicit
Функция преобразования для преобразования вашего класса в true
или false
.
//usage
bool value = yourclassinstance; //yourclassinstance is converted into bool!
Как говорили другие, это для преобразования типов, в данном случае в bool
. Например:
class A {
bool isItSafe;
public:
operator bool() const
{
return isItSafe;
}
...
};
Теперь я могу использовать объект этого класса, если это логическое значение:
A a;
...
if (a) {
....
}
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;
}
Другой распространенный способ использования для СТД контейнеров, чтобы сделать сравнение равенства на ключевых значений внутри пользовательских объектов
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;
};
В этом примере используется 'operator()' not 'operator bool'. Они совершенно разные. 'operator()' является оператором вызова, так что 'Comparer' может быть вызван как функция. Этот 'operator()' просто происходит, чтобы возвращать 'bool', но это не делает его таким же, как' operator bool', что просто допускает неявный приведение к 'bool'. – anthropomorphic
я хотел бы дать больше кодов, чтобы было ясно.
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
}
+1 для ссылки на Safe Bool Idiom – greyfade
«используется, как если бы это был BOOL» ложно означает, что вы могли бы, например, присвоить ему логическое значение. Скорее, в коде плаката он генерирует временную переменную типа bool, которая относится к мгновенному значению col, но впоследствии не зависит от объекта, который его создал. Кроме того, упоминание об Идиоме Safe Bool велик, но просто для регистрации того, что существуют противоположные взгляды: IMHO «никогда не использовать его» - это сверху - он дает более строгие проверки компилятора против глупого злоупотребления ценой более запутанного API что может привести к случайному неправильному использованию. –
@Tony: Ну, его можно использовать, как если бы это был bool; так как результатом преобразования является rvalue ('bool'), нет, вы не можете назначить ему. Если бы это была изменяемая lvalue (например, 'bool &'), то вы могли бы назначить ей. Что касается правильности, я утверждаю, что 'operator bool()' всегда неверен, поскольку позволяет использовать объект типа класса в огромном количестве ситуаций, когда вы никогда не захотите его использовать. Safe Bool - превосходная альтернатива. –