12.4 equals函数

优质
小牛编辑
133浏览
2023-12-01

两张牌要相等的话,必须花色和大小都相同。十分不幸,“==”操作符不能用于像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;
}

当然,这就是口味的问题了。我的观点是,不管成员函数版本还是非成员函数版本,读者都要能熟练编写,所以能根据条件选择最合适的版本。