为了在 if 语句中使用我的类,要重载哪个运算符? [复制]

Posted

技术标签:

【中文标题】为了在 if 语句中使用我的类,要重载哪个运算符? [复制]【英文标题】:Which operator to overload in order to use my class in an if-statement? [duplicate] 【发布时间】:2013-03-15 01:13:01 【问题描述】:

比如我定义了一个类

class MyClass

   ....
;

我必须重载哪个运算符才能与 MyClass 对象进行 if 比较?

例如:

MyClass cc;
if ( cc ) // compile error

   //do some stuff

我试过了

 bool operator == ( int value ) ; //guess the if () will call this

 bool operator != ( int value ) ;   

但两者都给我一个编译错误!

【问题讨论】:

@FrédéricHamidi:在存在 C++11 的情况下,此类问题的答案看起来会有所不同(现在建议使用显式运算符 bool 而不是安全 bool 习惯用法)。我不确定 SO 如何处理这种信息随时间的变化...... 您的示例中没有比较。如果要隐式转换为bool,请定义operator bool()。顺便说一句,您永远不会覆盖运算符。您要么覆盖或重载一个。这些术语有不同的含义。 @PlasmaHH,在 David Rodriguez 的回答下的评论中指出了这一点。应该没问题。 【参考方案1】:

您应该提供bool 转换运算符:

struct MyClass

  explicit operator bool() const  return true;    
;

在这里,explicit 运算符用于防止不必要的隐式转换为其他类型,特别是数字类型。请注意,这只能从 C++11 开始。

【讨论】:

explicit?你确定这个? @bash.d 是的,explicit 在这里是正确的。 if 表达式是“上下文转换为布尔值”,可以使用显式运算符。它可以防止隐式转换的所有混乱。 @Angew 真棒!不知道这个……你在 Stroustrup 的书中找到了吗? @MarkRansom:有一个特殊的例外是允许在if(或类似的)语句中使用explicit 转换运算符。 请注意,在 C++03 中,这是非常不推荐的。如果没有explicit,使用转换为bool 将在您不希望的许多情况下触发。【参考方案2】:

operator bool() 是您想要的。它负责从您的类到类型bool 的类型转换。

【讨论】:

【参考方案3】:

您必须为bool 或可转换为bool 的内容提供转换运算符。如果你有 C++11,最好的方法是:

class MyClass

public:
  explicit operator bool () const 
    ...
  
;

如果您没有 C++11(或至少它不支持显式转换运算符),事情会变得更加棘手(因为隐式转换会在您最意想不到的时候让您非常痛苦)。有关这方面的更多信息,请参阅safe bool idiom。

【讨论】:

我不知道 C++11 为 explicit 关键字添加了新用法。 @MarkRansom 是的,确实如此,您现在也可以拥有显式转换运算符,而不仅仅是构造函数。非常有用,IMO。【参考方案4】:

您可以覆盖operator bool(),但根据您的示例,您还可以考虑创建将返回bool 的简单方法。那么它的用法可能如下所示:

MyClass cc;
if (cc.isValid())

   // do some stuff

在这种情况下会更直接,也更容易阅读。自定义操作符对很多事情都很有用,但不要强求。有时最好keep it simple :)

【讨论】:

以上是关于为了在 if 语句中使用我的类,要重载哪个运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

运算符重载

c语言中,三木运算符和if语句哪个效率更高一些?

高级异常运算符重载

C ++:使用父类运算符函数更新子类对象的继承变量

运算符重载

C++的=重载问题,怎样为两个有相同成员的类赋值