【问题标题】:overloading operators, what is the purpose of the overladed operator in this example重载运算符,此示例中重载运算符的目的是什么
【发布时间】:2013-05-06 11:54:30
【问题描述】:

我一直试图理解在这段代码中重载运算符的使用,但是,我无法完全理解它。我不完全理解重载运算符的目的或为什么需要它。我知道这是一个新手问题,但如果有人能解释一下,我将不胜感激。

const int Card::operator+(const Card& B)
{
if ((faceValue ==1 || B.faceValue == 1) && (faceValue + B.faceValue)<= 11)
    return 10 + faceValue + (B.faceValue);
else
    return faceValue + (B.faceValue);

}

再次感谢您对此提供的任何帮助。

【问题讨论】:

    标签: c++ operators operator-overloading overloading


    【解决方案1】:

    每当您对用户定义的类型进行操作时,都会出现运算符重载,例如:这里是 Card 类的对象。 '+' 运算符用于原始数据类型,如 int、float、double。因此,您在这里所做的是添加“+”的功能以对类对象进行操作。

    @Mats Petersson 提到的也是正确的,你不应该在运算符重载函数中强加任何逻辑,如果需要,可以使用不同的函数。

    【讨论】:

      【解决方案2】:

      “目的”是将两个Card 对象加在一起。通常,您只能使用 + 在 C 和 C++ 中添加整数类型、指针类型 [具有整数类型] 和浮点类型。其他任何事情都需要特殊的运算符。

      其中的实际数学似乎是 BlackJack 的一部分,其中 ACE 被视为 110,具体取决于具体情况。

      编辑:我个人认为这不是很好地使用operator+,因为operator+ 的期望是把两个东西加在一起,而不是应用逻辑,然后根据一些“规则”做不同的加法。游戏”。这遵循“没有惊喜”的规则。应该使用具有合理名称的函数,例如 CalculateHand

      Edit2:除了上述“思考”之外,我还要补充一点,例如纸牌游戏的逻辑不应该在Card 中处理。游戏的逻辑属于任何“处理”牌的东西——无论是什么游戏,扑克、二十一点或纸牌,牌的行为都应该完全相同。

      【讨论】:

      • 我会 100% 同意你的观点,这也是我问这个问题的部分原因。我和你的想法一样,你会把逻辑放在另一个类中。但是,这是一个类分配,我只是想了解为什么要使用重载运算符以及将来如何使用它。这个代码是导师分配的,我与它无关。不幸的是......
      • 说到这个我还是觉得很傻。例如,我不知道重载运算符如何处理const Card&amp;b。我现在应该把它记下来了,很抱歉一直问同样的问题。
      • 对,所以一个重载的operator+,一般来说,允许不“自然地”加在一起的类型,比如一张扑克牌(它有一张牌值和一套花色,所以它不是只是一个基本数字)要加在一起。另一个例子是,如果你有一个“分数”类,它的 1/3 表示为 1 和 3,而你想加上 1/6 来得到 1/2,Fraction operator+(const Fraction&amp; a, const Fraction&amp; b) 会很有意义。
      • 使用const Type &amp; 作为输入允许将值作为参考传递,但也可以是不一定是参考的东西,因此您可以例如使用a+b+c ,在这种情况下变为(a+b)+c。当然,a+b 不是“一个变量”,因此您不能将其用作真正的参考。通过引用传递“大”类型是有好处的,因为与每次复制整个类相比,它花费的时间更少,占用的堆栈空间也更少。
      • @matspetersson 我开始明白了,感谢您花时间解释它。因此,为了确定起见,您将使用重载运算符对类对象进行加法、减法、相等等操作,该类对象可能包含或可能不包含您通常无法执行的对象中包含的一个或多个内部部分,而同时返回一个类类型的对象。这是正确的吗?
      【解决方案3】:

      恕我直言,这是您应该使用运算符重载的一个很好的例子。似乎代码返回了一个根据特定游戏规则计算的值。也许二十一点,但没关系。我认为在这种情况下,它最好是一个具有适当名称的函数,而不是重载的运算符 +,因为后者对卡片没有一般概念。

      【讨论】:

      • 我有点不同意。我确实同意运算符重载不应该给运算符带来令人惊讶的目的。但是,我已经看到,对于某些特定的库(我在这里故意使用库),具有稍微不同含义的运算符确实有意义,当且仅当它们很好地解释了运算符的行为。比如说,对于一个深奥的 Blackjack 库(我们将其命名为 libbjack)或命名空间(bjack::),用这个实现重载 + 并很好地解释它对我来说听起来并不是一件坏事。
      • @Equalitiesofpolynomials 即使这样也没有多大意义,因为 BlackJack 允许您拥有两张以上的牌(根据我刚刚在 Wikipedia 上读到的内容,从未玩过该游戏)。 Card a, b, c; 不允许 a+b+c 并且如果您使用 int+Card 添加重载,随着错误可能性的增加,情况会变得更糟。但是好的,如果你把它放在一个命名空间 BlackJack (这不是 OPs 问题的一部分),你可能会侥幸成功:)
      • @DanielFrey 所以是的,我同意你的观点。 :) 但我认为 OP 是在问一个一般性问题,我没有意识到 OP 是直接询问这个代码段。因此,我评论了“通用运算符重载”而不是这个任务(我承认我不知道如何玩二十一点)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多