2011-01-05 51 views

回答

98

形式

operator TypeName() 

的成员函数是转换算子。它们允许使用类类型的对象,就好像它们是TypeName类型的对象,当它们是时,它们将使用转换函数转换为TypeName

在这种特殊情况下,operator bool()允许使用类类型的对象,就像它是bool一样。例如,如果有一个名为obj类类型的对象,你可以使用它作为

if (obj) 

这将调用operator bool(),返回结果,并将结果作为if的条件。

应该指出,operator bool()是一个非常糟糕的想法,你应该永远不要使用它。有关详细解释为什么它不好并解决问题,请参阅"The Safe Bool Idiom."

(C++ 0x,即将发布的C++标准修订版,增加了对显式转换运算符的支持,这些将允许您写一个安全的explicit operator bool(),可以正常工作,而不必跳过安全布尔成语的实现。)

+2

+1参考“拿来主义就好像它是一个布尔值”安全布尔成语 – greyfade 2011-01-05 02:35:29

+1

错误地暗示你可以,比方说,给它分配一个布尔值。相反,在海报的代码中,它会生成一个类型为bool的临时变量,它与col的瞬时值有关,但此后与创建它的对象无关。此外,提到Safe Bool Idiom非常好,但仅仅注明存在相反的观点:恕我直言,“永远不会使用它”的建议超越了顶层 - 它以更混乱的API为代价提供了更严格的编译器检查来防止愚蠢的滥用这可能会导致意外误用。 – 2011-01-05 03:00:49

+1

@Tony:好吧,它可以用来当作布尔;由于转换的结果是一个右值('bool'),否,你不能指定它。如果它是一个可修改的左值(例如'bool&'),那么你可以指定它。至于正确性,我认为一个'operator bool()'总是不正确的,因为它允许在你永远不想使用它的大量情况下使用类型对象。安全布尔是一个非常优越的选择。 – 2011-01-05 03:17:38

1

这是一个隐含的转换为bool。即只要允许隐式转换,您的类就可以通过调用该方法转换为bool

3

它是用户定义的implicit转换函数将您的类转换为truefalse

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

正如其他人所说的,它是用于类型转换的,在这种情况下是bool。例如:

class A { 
    bool isItSafe; 

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

    ... 
}; 

现在我可以使用这个类的一个对象,就好像它是一个布尔值:

A a; 
... 
if (a) { 
    .... 
} 
8
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; 
} 
-1

另一种常见的用途是用于性病容器做键值相等比较里面的自定义对象

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; 
}; 
+0

这个例子使用'operator()'而不是'operator bool'。他们完全不同。 'operator()'是调用操作符,所以'Comparer'可以作为一个函数被调用。这个'operator()'恰好会返回'bool',但这不会和'operator bool'相同,它只是允许隐式转换为'bool'。 – anthropomorphic 2014-08-16 02:56:47

4

我想给更多的代码来说清楚。

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 
}