一个 C++ 日期类(第二部分)
原著 Chuck Allison
翻译:孟谨
原文出处:Code Capsules:A C++ Date Class, Part 2
本文适合初级读者
int compare(const Date& d2) const;
Date::compare 类似于strcmp-如果当前对象(*this)在d2之前,它返回一个负整数;如果这两个日期相同,则返回0;否则返回一个正整数(参见 Listing 2 中的函数实现和 Listing 3 中的示例程序)。就像你们都很熟悉的C标准库中的qsort一样,你也可以使用Date::compare来对日期进行排序,就好像你使用strcmp对字符串进行排序一样。下面是一个可传递给qsort的比较函数(下个月的代码封装将包括qsort):#include "date.h"int datecmp(const void *p1, const void *p2){ const Date *d1p = (const Date *) p1, *d2p = (const Date *) p2; return d1p->compare(*d2p);}
大多数时候,拥有相关的运算符是更方便的,例如:if (d1 < d2) // do something appropriate..
使用Date::compare来添加一个"小于"运算符是非常容易的--只要在类的定义里插入下面这个内联成员函数就可以了:int operator<(const Date& d2) const{return compare(d2) < 0};
每一个表达式:d1 < d2出现的地方,都会被编译器翻译成函数调用的形式:d1.operator<(d2)
Listing 4 中类的定义中拥有六个相关的操作符,Listing 5中展示了更新之后的示范程序。既然函数Date::interval 的功能类似减法(它给出两个日期的差),把它重命名为Date::operator-就是件很自然的事情了。在做这个事情之前,我们仔细研究一下下列语句的语音:a = b - c;
无论变量是什么类型,下述语句总是成立的:a 是一个由减法产生的明确的对象,并且 b - c == - (c - b) 我们使用下列约定俗成的习惯,即一个正的日期对象的所有数据成员都是正的,反之亦然(不允许符号的混合)。在 Listing 7 中我用 Date::operator- (const Date&)代替了Date::interval,前者为每一个数据成员增加了正确的符号并且返回重新构造过的类的对象。
Listing 6 中重新定义的类中还包括了一个一元的"-"运算符函数,它的名字还是 Date::operator-,但是没有任何参数。编译器将把下列的语句1 - d2;-d1;
分别替换为:d1.operator-(d2); // Calls Date::operator-(const Date&)d1.operator-(); // Calls Date::operator-()
Listing 8 中有一个使用了新的成员函数的简单示例程序。
正如我以前所说的一样,一个日期类的对象应该具有和系统内建类型一致的外观和感觉--输入/输出支持。C++提供了能够处理标准类型的的输入输出操作的流的对象。例如下列程序 :#include <iostream.hmain(){ int i;&nb