您希望下个月的早餐、午餐和晚餐吃些什么?在第三天的晚餐喝多少盎司的牛奶?在第 15 天的早餐中需要在谷类食品添加多少葡萄干?如果您与大多数人一样,就会等到进餐时再做决定。C++在分配内存时采取的部分策略与此相同,让程序在运行时决定内存分配,而不是在编译时决定。这样,可根据程序的要,而不是根据一系列严格的存储类型规则来使用内存。C++使用new和delete 运算符来动态控制内存。遗憾的是,在类中使用这些运算符将导致许多新的编程问题。在这种情况下,析构函数将是必不可少的而不再是可有可无的。有时候,还必须重载赋值运算符,以保证程序正常运行。下面来看一看这些问题。
我们看一个失败的例子
程序清单 12.3是从处于开发阶段的 程序中摘录出来的,
演示了 StringBad 的构造函数和析构函数何时运行及如何运行。
该程序将对象声明放在一个内部代码块中,因为析构函数将在定
义对象的代码块执行完毕时调用。如果不这样做,析构函数将在
main0)函数执行完毕时调用,导致您无法在执行窗口关闭前看到
析构函数显示的消息。请务必将程序清单12.2和程序清单12.3 一起编译。
头文件
//strngbad.h -- flawed string class definition
#include<iostream>
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
char* str; //pointer to string
int len; //length of string
static int num_strings; //number of objects
public:
StringBad(); //default constructor
StringBad(const char* s); //constructor
~StringBad(); //destructor
//friend function
friend std::ostream& operator<<(std::ostream& os, const StringBad& st);
};
#endif // !STRNGBAD_H_
//strngbad.cpp