我遇到了一个我无法自己回答的问题。此外,我没有在谷歌和这里找到答案。比如,我想在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子句中实际使用了哪一个重载运算符?无论哪种方式,结果显然是相同的。
答案 0 :(得分:8)
它将使用operator!
。
参数类型与参数匹配的函数将优先于需要类型转换的函数。
答案 1 :(得分:2)
你会发现operator !
被执行是因为它是最直接的解决方案。如果使用的是operator bool
,则必须先调用转化运算符,然后将!
分别应用于此。
作为一般规则,尽管避免这种情况是个好主意。通常更好的方法是定义bool
转换,因为严格来说,这是您希望逻辑运算符执行的操作,而不是直接MyClass
。定义两者都会产生一些可读性问题,并且是冗余代码重复的一种形式(将来会导致程序员错误)。