当一个对象同时提供`operator!`和`operator bool`时,它在表达式`!obj`中使用?

时间:2013-12-19 14:18:02

标签: c++ overloading operator-keyword

我遇到了一个我无法自己回答的问题。此外,我没有在谷歌和这里找到答案。比如,我想在if子句中“检查对象的有效性”,如下所示:

MyClass myObject;

// [some code, if any]

if (!myObject)
{
    // [do something]
}

MyClass定义如下:

class MyClass
{
public:
    MyClass() { };
    virtual ~MyClass() { };
    bool operator!()
    {
        return !myBool;
    };
    operator bool()
    {
        return myBool;
    };
private:
    bool myBool = 0;
};

我现在的问题是:在这个if子句中实际使用了哪一个重载运算符?无论哪种方式,结果显然是相同的。

2 个答案:

答案 0 :(得分:8)

它将使用operator!

参数类型与参数匹配的函数将优先于需要类型转换的函数。

答案 1 :(得分:2)

你会发现operator !被执行是因为它是最直接的解决方案。如果使用的是operator bool,则必须先调用转化运算符,然后将!分别应用于此。

作为一般规则,尽管避免这种情况是个好主意。通常更好的方法是定义bool转换,因为严格来说,这是您希望逻辑运算符执行的操作,而不是直接MyClass。定义两者都会产生一些可读性问题,并且是冗余代码重复的一种形式(将来会导致程序员错误)。