【问题标题】:When an object provides both `operator!` and `operator bool`, which is used in the expression `!obj`?当一个对象同时提供 `operator!` 和 `operator bool` 时,这在表达式 `!obj` 中使用?
【发布时间】:2014-01-08 03:49:11
【问题描述】:

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

【问题讨论】:

  • 我认为它会走阻力最小的道路,并致电operator!...
  • 在读完这篇文章之前不要考虑重载 bool:stackoverflow.com/questions/6242768/…
  • 是的,只需执行operator bool 并明确说明即可。无论如何,operator! 不需要转换。 operator bool 需要用户定义的转换。
  • @doctorlove 完美主义ftw!完成:-)
  • 只是一个问题:使用operator bool() 真的有意义吗?这可能是最常见的运算符重载滥用之一(包括在std::ios_base 中);一个成员函数isValid(),或者其他的,要清楚得多。

标签: c++ overloading operator-keyword


【解决方案1】:

它将使用operator!。

将优先选择参数类型与实参匹配的函数,而不是需要类型转换的函数。

【讨论】:

    【解决方案2】:

    您会发现operator ! 被执行,因为它是最直接的解决方案。如果它使用 operator bool 代替,那么它必须先调用转换运算符,然后将 ! 单独应用于该运算符。

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

    【讨论】:

    • 我不同意您在上一部分中描述的冗余。 operator bool() 是一个转换运算符。所以像bool myTest = myObject; 这样没有operator bool() 的声明是行不通的。
    • 我想你误解了我的意思。我的意思是定义operator bool 和 operator ! 实际上是代码重复,因为您在不必要地复制相同(尽管是倒置的)逻辑。
    猜你喜欢
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多