C++ 当一个对象同时提供“运算符!”以及表达式`中使用的`运算符bool`!obj`?

C++ 当一个对象同时提供“运算符!”以及表达式`中使用的`运算符bool`!obj`?,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我遇到了一个我自己无法回答的问题。另外,我在谷歌和这里都没有找到答案。比如,我想在if子句中“检查对象的有效性”,如下所示: MyClass myObject; // [some code, if any] if (!myObject) { // [do something] } 让MyClass定义如下: class MyClass { public: MyClass() { }; virtual ~MyClass() { }; bool operator

我遇到了一个我自己无法回答的问题。另外,我在谷歌和这里都没有找到答案。比如,我想在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子句中实际使用了哪一个重载运算符?无论哪种方式,结果都明显相同。

它将使用
运算符


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

您将发现
运算符是因为它是最直接的解决方案。如果它使用了
运算符bool
,那么它必须首先调用转换运算符,然后应用
与此分开


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

我认为它将走阻力最小的道路,并调用
操作符
…在阅读之前不要考虑重载bool:是的,只需执行
运算符bool
一个并使其显式。无论如何,
操作员不需要转换<代码>运算符bool
需要用户定义的转换。@doctorlove Perfectism ftw!完成:-)只是一个问题:使用
操作符bool()
真的有意义吗?这可能是运算符重载最常见的滥用之一(包括在
std::ios_base
);成员函数
isValid()
或其他更清楚的方法。我不同意您在上一部分中描述的冗余<代码>运算符bool()
是一个转换运算符。所以像
boolmytest=myObject这样的语句没有
操作符bool()
在场是不行的。我想你误解我了。我的意思是定义
操作符bool
操作符
实际上是代码复制,因为您不必要地复制相同的(尽管是反向的)逻辑。