codecamp

C++ equals函数

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

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

C++ printCard函数
C++ isGreater函数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }