6.4 带有构造函数和析构函数的Stash

在前几章的例子中,都有一些很明显的函数对应为构造函数和析构函数:initialize()和cleanup()。下面是带有构造函数与析构函数的Stash头文件。

6.4 带有构造函数和析构函数的Stash - 图1

下面是实现文件,这里只对initialize()和cleanup()的定义进行了修改,它们分别被构造函数与析构函数代替了。

6.4 带有构造函数和析构函数的Stash - 图2

6.4 带有构造函数和析构函数的Stash - 图3

require. h中的函数是用来监视程序员错误的,代替函数assert()的作用。但是函数assert()对失败操作的输出不及require.h的函数有效(关于这一点将在本书后面说明)。

因为inflate()是私有的,所以require()不能正确执行的惟一情况就是:其他成员函数意外地把一些不正确的值传递给了inflate()。如果能够确保这种情况不会发生,那么就考虑删除函数require(),但是在类稳定之前不要删除,当把新的代码加入到类中时,出错的可能性就会存在。由此看来,使用require()的代价很低(通过使用预处理器,有些代码能够被自动删除),这样代码也会具有很好的健壮性。

注意,在下面的测试程序中,Stash对象的定义放在紧靠使用对象的地方,对象的初始化通过构造函数的参数列表来实现,而对象的初始化似乎成了对象定义的一部分。

6.4 带有构造函数和析构函数的Stash - 图4

6.4 带有构造函数和析构函数的Stash - 图5

再看看cleanup()调用已被取消,但当intStash和stringStash越出程序块的作用域时,析构函数被自动地调用了。

在Stash例子中需要注意的是:仅仅使用了内建类型,它们没有构造函数。如果试图将类对象拷贝到Stash中,就会出现很多问题,程序也不会正确执行。标准的C++库能够把对象正确地拷贝到使用它的容器中,但是,这是一个相当复杂的过程。在下面的Stack例子中,将会看到使用指针可以避免出现这种问题,在后面的章节中将修改Stash以便使用指针。