| 一个 C++ 日期类(第二部分) 原著 Chuck Allison 翻译:孟谨 原文出处:Code Capsules:A C++ Date Class, Part 2 本文适合初级读者 Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发。他目前的兴趣是面向对象的技术及其教育。他是X3J16,ANSI C ++标准化委员会的一员。发送e-mail 到 [email protected],或者拨打电话到 (801)240-4510 均可以与他取得联系。 在上个月的封装中我提出了一个简单的C++日期类的雏形。为了提供一个能够计算两个日期的间隔的函数,这个类举例说明了C++的下列特征: 内联函数 引用 构造函数 对私有数据成员的访问控制 在这个月的部分里我将增加相关的运算符、输入/输出操作和得到当前日期的能力。它们示范了下列特征: 运算符重载 流 友元函数 静态成员 当使用日期的时候你经常需要确定某一日期是否在另一日期之前。我将为日期类增加下面这个成员函数(参见 Listing 1):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.h>main(){ int i;&nb
|