Table of Contents
12.1 动态内存和类
12.1.1 复习范例和静态类成员
- 使用了新的存储类型:静态类成员
- 类声明使用char指针,而不是char数组,意味着类声明没有为字符串本身分配存储空间,而是在构造函数中使用new来为字符串分配空间,这避免了在类声明中预先定义字符串的长度。
- 静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本。这对于所有类对象都具有相同值的类私有数据是非常方便的。
- 静态数据成员在类声明中声明,在包含类方法的文件中初始化,初始化时使用作用域操作符来指出静态成员所属的类。但如果静态成员是整型或枚举型const,则可以在类声明中初始化。
- 删除对象可以释放对象本身占用的内存,但并不能自动释放属于对象成员的指针指向的内存。因此,必须使用析构函数,在析构函数中使用delete语句可确保对象过期时,由构造函数使用new分配的内存被释放。
- 自动存储对象被删除的顺序与创建顺序相反。
- 当使用一个对象来初始化另一个对象时,编译器将自动生成复制构造函数。
12.1.2 隐式成员函数
- C++自动提供了这些成员函数:默认构造函数,复制构造函数,赋值操作符,默认析构函数,地址操作符。
- 创建对象时总是会调用构造函数。
12.1.3 改进后的新String类
12.1.4 在构造函数中使用new时应注意的事项
- 如果在构造函数中使用new来初始化指针成员,则应在构造函数中使用delete。
- new和delete必须相互兼容。new对应于delete,new[]对应于delete[]。
- 如果有多个构造函数,则必须以相同的方式使用new,要么都带中括号,要么都不带。不过,可以在一个构造函数中使用new来初始化指针,而在另外一个构造函数中将指针初始化为空。
- 应定义一个复制构造函数,通过深度复制将一个对象初始化为另一个对象。具体地说,复制构造函数应分配足够的空间来存储复制的数据,并复制数据,而不仅仅是数据的地址。另外,应更新所有受影响的静态类成员。
- 应当定义一个赋值操作符,通过深度复制将一个对象复制给另一个对象。
12.1.5 有关返回对象的说明
12.1.6 使用指向对象的指针
12.1.7 复习各类技术
12.2 队列模拟
12.2.1 队列类
- 抽象数据类型(Abstract Data Type,ADT)