再上一篇:9.2 类
上一篇:9.3 对象
主页
下一篇:9.5 this指针
再下一篇:第十章 构造函数和析构函数
文章列表

9.4 成员函数的重载

《VC++程序设计基础》,讲述C++语言的语法和标准库,以及Visual C++ 函数库和MFC类库的使用,并附相关代码示例。

类中的成员函数与前面介绍的普通函数一样,成员函数可以带有缺省的参数,也可以重载成员函数。我们通过一个例子来说明之。

例 9.8 处理一个数组构成的线性表,动态产生线性表,并输出线性表中的数据。分析:线性表用来存放若干个整数,用一个指针指向这个线性表。线性表是动态产生的,最初通过成员函数初始化线性表的大小,当放入线性表中的数据大于线性表的大小时,自动扩大线性表。可以通过三个参数来描述一个线性表:一个是整数类型的指针变量List,它指向线性表;第二个是一个无符号整数 nMax,它指明线性表的长度(大小);第三个也是一个无符号整数nElem,它指出当前线性表中实际存放的整数个数。程序为:

#include

class ListClass {

int *List; //指向线性表的指针

unsigned nMax; //表的最大长度

unsigned nElem; //表中当前的元素个数

public:

void Init(int n=10) //初始化针表,最大长度的缺省值为10

{ List = new int[n]; //动态分配线性表的空间

nMax=n;

nElem=0; //为空表

}

int Elem(int);

int &Elem(unsigned n)

{ return List[n]; } //返回线性表中第n个元素的引用

unsigned Elem(void)

{ return nElem; } //返回当元素的个数

unsigned Max(void)

{ return nMax; } //返回线性表的长度

void Print(void );

int GetElem(int i) //返回线性表中第i个元素的值

{

if((i>=0 )&& (i<=nElem)) return List[i];

else return 0;

}

void Destroy(void) {delete [nMax ] List;} //收回线性表占用的存储空间

} ;

int ListClass::Elem(int elem) //在线性表尾增加一个元素

{

if (nElem < nMax) { //A

List[nElem++]=elem;

return nElem;

}

else { //B

int *list ;

list = new int [nMax +1];

for(int i= 0;i< nElem; i++) list[i] = List[i];

delete [nMax ] List ;

nMax ++;

List = list;

List[nElem++]=elem;

return nElem;

}

}

void ListClass::Print(void) //输出线性表中的所有元素

{

for (int i=0;i

cout << List[i] << '\t';

cout <<'\n';

}

void main(void)

{

ListClass list,list1;

list.Init(10);

list1.Init(20);

for(int i=0;i<10;i++)

list1.Elem(i);

cout <<"线性表list的元素个数为: "<

cout <<"线性表list长度数为: "<

cout <<"线性表list1的元素个数为: "<

cout <<"线性表list1长度为: "<

list1.Print();

list1.Elem(3u)=100; //C

cout <<"现在线性表list1中的第三个值为: "<

list1.Elem(20);

list1.Elem(200);

cout <<"现在线性表list1中元素个数为: "<

list1.Print();

cout<<"线性表list1中的最后一个元素为:"

<

list.Destroy();

list1.Destroy();

}

执行程序后的输出为:

线性表list的元素个数为: 0

线性表list长度数为: 10

线性表list1的元素个数为: 10

线性表list1长度为: 20

0 1 2 3 4 5 6 7 8 9

现在线性表list1中的第三个值为: 100

现在线性表list1中元素个数为: 12

0 1 2 100 4 5 6 7 8 9 20 200

线性表list1中的最后一个元素为:200

类ListClass中的成员函数Init( )是一个具有缺省参数的函数,它的缺省值为10。该函数的功能是初始化线性表,其参数是线性表的大小。

类ListClass中有三个重载了的公有成员函数:成员函数int Elem(int)的功能是在线性表中增加一个元素,并返回线性表中当前的元素个数。A行表示线性表不满,直接将输入参数加在线性表尾;B行表示线性表满,这时要重新动态申请一个线性表存储空间,将List所指向的线性表中的元素值依次拷贝到list所指向的线性表中,再将输入参数加在线性表尾,并释放List所指向的线性表。最后使List指向新的线性表,并初始化nMax和nElem的值。成素成员函数int &Elem(unsigned n)的功能是返回对线性表中第n个元素的引用,这样既可以实现对第n个元素的赋值(如程序中的C行,将对象list1中的线性表的第三个元素的值置为100),又可能取得该元素的值(如程序中的D行)。成员函数unsigned Elem(void)返回线性表中当前的元素个数。

另外的几个成员函数的功能分别在程序中都作了说明,并且功能比较简单,不作进一步的说明了。最后要对成员函数Destroy()的作用作进一步的说明。由于线性表是用运算符new动态地生成的,当对象list和list1结束其生存期时,系统可以自动地收回这二个对象所占用的空间,但系统不能自动地收回用运算符 new动态分配的存储空间。所以该函数的作用是收回线性表已经占用的存储空间。