12.4 equals函数

最后更新于:2022-04-01 06:23:40

两张牌要相等的话,必须花色和大小都相同。十分不幸,“==”操作符不能用于像Card这种用户定义类型,所以我们需要自己编写一个比较两张牌的函数,即equals函数。也可以通过重写“==”操作符的定义实现此功能,不过本书不做介绍了。 很明确,equals函数的返回值应该是布尔类型,用以说明两张牌是否相等。同样可以明确的是,该函数需要有两个Card类型的参数。但是我们还要做出一个选择,那就是应该把equals设计成成员函数还是独立函数? 将equals设计为成员函数,代码如下: ~~~ bool Card::equals (const Card& c2) const { return (rank == c2.rank && suit == c2.suit); } ~~~ 使用这个函数时,必须通过一个对象来调用,而把另一个对象当做参数: ~~~ Card card1 (1, 11); Card card2 (1, 11); if (card1.equals(card2)) { cout << "Yup, that’s the same card." << endl; } ~~~ 在我看来,像equals这样两个参数对称的函数,这样调用看起来很奇怪。对称是指, 以“A是否等于B”或者“B是否等于A”两种方式提问,其实没什么关系。既然如此,我想以非成员函数的方式重写equals函数更好: ~~~ bool equals (const Card& c1, const Card& c2) { return (c1.rank == c2.rank && c1.suit == c2.suit); } ~~~ 调用这个版本的函数时,参数并肩出现,至少在我看来这样逻辑上更有意义。 ~~~ if (equals (card1, card2)) { cout << "Yup, that’s the same card." << endl; } ~~~ 当然,这就是口味的问题了。我的观点是,不管成员函数版本还是非成员函数版本,读者都要能熟练编写,所以能根据条件选择最合适的版本。
';