多语言展示
当前在线:488今日阅读:172今日分享:19

C++怎样实现动态增长的字符串类

刚学C++编程的朋友如果要自己实现一个动态增长的字符串类,可能会觉得困难不少。那么,这应该怎么做呢?
工具/原料

VS

一、分析
1

首先,此字符串类需要拥有一个保存字符的成员,由于需要支持字符动态增长,因此必须为一个动态分配的字符数组。其次,为了操作更加简便,还可以添加一些辅助成员。为了安全起见,我们将字符数组成员和辅助成员设为私有,这样,对用户来说,它们是不可见的。

2

要实现动态增长的字符串类,其关键之处便是动态内存分配。它必须满足三个基本要求:1)分配足量的内存空间来容纳新字符。2)将原来的字符移动到新分配的空间,并添加新增的字符。3)释放原来的内存空间(避免内存泄漏)。

二、实例讲解
1

我们假设将此类命名为 str。首先,定义它的数据成员。其中,element 为指向保存字符的数组的指针;len 为辅助成员,用来表示当前数组内有多少个字符。它们均被定义为私有成员。

2

接着,加上类的构造函数(两个)和析构函数。由于element是一个动态分配的指针,在析构时必须将其释放,否则会造成内存泄漏。

3

由于 str 类需要保存动态增长的字符,因此要有一个分配内存空间的函数 Resize(由于此函数无需提供给用户使用,所以定义为私有)。再者,str类需要重载赋值操作符(operator=),以便能够接收相应的字符串。此外,str类需要输出,所以必须重载输出操作符(operator<<)。注意:重载输出操作符的函数必须定义为非成员函数。由于在此函数中还要访问类的私有数据成员,因此需要定义为友元。在这儿请注意,友元在类中无所谓公有私有,其效果都是一样的(一般而言,为了醒目起见,通常将友元写在类的开始部分)。

4

作为一个最简单的例子,以上是 str 类需要实现的最基本的函数。下面,我们来实现它们。

5

重载的构造函数。一个是默认构造函数,一个是形参为 const char[](即 const char*) 的构造函数。注意,在实际实用中,此处的 for 循环最好用 memcpy 代替(用法详见第7步的第二个函数),从而使代码显得更加简练美观。在这儿,暂且用 for 循环只是为了让大家更好理解。

6

动态分配内存函数。注意,它的返回类型为 *this。在这里,realloc是一个很有用的函数。它将形参一指定的内存区域更改为形参二指定的大小,并将原内存空间的数据移动到新空间中,同时自动释放原内存空间,然后返回新内存空间指针。注意,如果新空间小于原空间,则会丢失数据。

7

重载的赋值操作符和输出操作符的实现。注意,重载的输出操作符函数不能是类的成员函数(必须定义为非成员函数)。否则,左操作数将只能是该类类型的对象(但在这里我们需要是cout)。同时,该函数又必须有权访问类的私有数据成员,因此在这儿它定义为了一个友元函数(见类中声明)。

8

下面,在主函数中添加一些代码测试一下这个类。

9

下面是测试运行的结果。

注意事项

输出操作符不能定义为类成员。

推荐信息