为了在 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 语句中使用我的类,要重载哪个运算符? [复制]的主要内容,如果未能解决你的问题,请参考以下文章