一个C++日期类(第一部分)
,Plum 和 Saks 称其做"类型安全的 C"(参见 C++ Programming Guidelines, Plum and Saks, Plum-Hall, 1992)。
正如我在这篇文章和下一篇文章中所陈述的一样,C++支持数据抽象--用户可以自己定义行为与内建类型相像的数据类型,这种数据抽象机制包括:类,存取限制,构造和析构函数,运算符重载,模板和异常处理。 面向对象的程序设计通过探求类与类之间的关系在数据抽象上更进一步。其中两个关键的概念是继承(通过声明一个新类与另一个类的相似与区别定义它,其中的相似被重用)和多态(为一族相关的操作提供同一个接口,运行时识别)。C++分别通过类的派生和虚汗数来支持继承和多态。 类 一个类就是一个扩展的struct。除了定义数据成员,你还可以为其添加成员函数。日期类的定义在文件data.h中的 Listing 1。它与上个月的C版本不同,因为在这里interval函数是一个成员函数而不是全局函数。Date::interval()的实现在 Listing 2 中。"::"叫做作用域运算符。它告诉编译器interval函数是Date类的成员函数。interval函数原型中的"&"说明这个函数的参数由应用传递(参见关于引用的选项)。Listing 3 中的程序展示了如何使用这个日期类。你必须使用结构成员的语法来调用 Date:: interval():
Date作为类型标识符,就像系统内建类型一样的发挥作用(例如,你可以定义Date的对象而不使用struct关键字)。永远也不必做如下的定义:
事实上,类的概念是如此的基本,以至于C++已经将结构标签和普通的标识符结合成一个独立的名字空间。 注意我已经将isleap定义成了一个内联函数(在C版本中它是一个宏)。内联函数像宏一样将代码展开,但它也像普通函数一样进行作用阈和类型的检查。除非你要使用the stringizing or token-pasting operations of the preprocessor,,否则在C++中不需要使用 function-like 的宏。现在考虑 Listing 2 中的这个声明:
year指的是什么对象?在C版本中,这个声明如下:
既然成员函数的调用总是与对象相关联(例如,d1. interval (d2)),因此当成员函数没有前缀修饰的时候,通常是相关联对象的成员(在这里,year 指的是d1.year)。this关键字代表一个指向潜在对象的指针,因此我可以做一个更加明确的声明:
这是一种特殊的成员函数叫做构造函数。构造函数允许你在一个对象被创建的时候指定怎么样初始化这个对象。当你定义一个没有初始值的日期对象时,首先调用缺省构造函数(因为它没有任何参数):
当成员函数的实现比较简单的时候,你可以把它们的实现移到类的定义里面去,使它们成为内联函数(参见 Listing 7 ——不要忘记在 Listing 5 中移走它们)。Listing 6 中的测试程序推迟构造对象d1、 d2 和 result 直到需要它们的时候(在C++中,对象的定义可以出现在任何声明中)。 我几乎已经列举了数据抽象,也就是封装的主要特征。当一个用户自定义类型的内部表现和外部接口设计良好,就叫做一个封装。我确实定义了一个和系统内建类型一样作用的新类型,我不允许任何无意间的对它的内部表现的访问制。例如,像这样,用户可以执行如下的语句:
一个行为良好的对象控制着对它的内部数据成员的访问。在一个实际的日期类中,我允许用户对年月日进行排队,但不允许直接设置它们的值。因此我定义它们为private,并且提供了存取函数来得到它们的 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |