一个 C++ 日期类(第二部分)

2016-01-29 12:17 9 1 收藏

一个 C++ 日期类(第二部分),一个 C++ 日期类(第二部分)

【 tulaoshi.com - C语言心得技巧 】

一个 C++ 日期类(第二部分)

原著 Chuck Allison

翻译:孟谨


原文出处:Code Capsules:A C++ Date Class, Part 2

本文适合初级读者

  Chuck Allison 是盐湖城圣 Latter Day 教堂总部下耶稣教堂家族历史研究处的软件体系设计师。他拥有数学学士和数学硕士学位。他从1975年起开始编程,从1984年起他开始从事c语言的教学和开发。他目前的兴趣是面向对象的技术及其教育。他是X3J16,ANSI C ++标准化委员会的一员。发送e-mail 到 allison@decus.org,或者拨打电话到 (801)240-4510 均可以与他取得联系。
  在上个月的封装中我提出了一个简单的C++日期类的雏形。为了提供一个能够计算两个日期的间隔的函数,这个类举例说明了C++的下列特征:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com) 内联函数 引用 构造函数 对私有数据成员的访问控制

  在这个月的部分里我将增加相关的运算符、输入/输出操作和得到当前日期的能力。它们示范了下列特征:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com) 运算符重载 友元函数 静态成员

  当使用日期的时候你经常需要确定某一日期是否在另一日期之前。我将为日期类增加下面这个成员函数(参见 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.hmain(){  int i;&nb
                        

来源:http://www.tulaoshi.com/n/20160129/1485428.html

延伸阅读
第一部份:设计网页 第二部份:切图 CSS布局   在上一个教程里面,我们创建了一个包含了所有框架,设计,色彩,拟议定的板式和基本内容的设计模型。 现在是时候让我们回顾一下之前的计划和概念设定来看看——哪些需要使用纯粹的xhtml和css,哪些需要使用到原来的图片。 首先被导出的元素是大的背景图。隐藏掉其他所有...
《风卷残云》demo第二部游戏各2种模式视频攻略欣赏 游戏封面 基础信息 游戏名称:风卷残云 英文名称:HurricaneX2 游戏类型:格斗类 游戏制作:秋千软件 游戏发行:百游 游戏语言:中文 登录平台:PC/XOBX360 游戏讨论: 新报:http://0day.ali213.net/html/2011/6276.html 游戏专题:     游戏简介 《风卷残云》试...
《风卷残云》Demo第二部游戏各两种模式视频攻略欣赏 游戏简介 《风卷残云》试玩版今日推出 不一样的中国功夫活着,是我战斗的理由!罗劲 中国首款大型功夫动作游戏《风卷残云》PC版即将于不久后正式宣布上市时间。今日百游官方正式放出全新简体中文试玩版下载,玩家将可先行体验不一样的中国功夫快打旋风。 全新简体中文试玩版特色简介: 经...
在设计良好的面向对象系统中,为了压缩其对象内部的空间,仅留两个函数用于对象的拷贝:一般称为拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)。我们将它们统称为拷贝函数(copying functions)。如果需要,编译器会生成拷贝函数,而且阐明了编译器生成的版本正象你所期望的:它们拷贝被拷贝对象的全部数据。 ...
介绍一个专门处理C++异常的类 作者:PJ Naughter 下载源代码和例子 简介: CExceptionLogger ,是一个可以免费使用的C++类,用它可以截获未处理异常,如:非法存取、栈溢出、被零除等,并可以将异常详细信息记录到日志文件。这个类源自于MSDN...

经验教程

870

收藏

47
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部