Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:36:28
C++类的基本定义与实现[一]

C/C++类的基本定义与实现[一]

实现

程序描述:【源程序 2-1】定义和实现了一个数组类,并应用这个类建立一个动态数组,然后为数组元素赋值,并向显示设备输出每个数组元素的值。

【源程序 2-1】

01 #include

02 using namespace std;

03

04 class Array

05 {

06 protected:

07 double *dataPtr;

08 unsigned size;

09 public:

10 Array(unsigned InitSize);

11 Array();

12 ~Array();

13 unsigned getSize() const

14 { return size;}

15

16 void store(double x ,unsigned index=0)

17 { dataPtr[index]=x;}

18

19 double recall(unsigned index)

20 { return dataPtr[index];}

21 };

22

23 Array:: Array(unsigned InitSize)

24 {

25 size=InitSize;

26 dataPtr=new double[size];

27 }

28

29 Array:: Array()

30 {

31 size=1;

32 dataPtr=new double[size];

33 }

34

35 Array::~Array()

36 { delete []dataPtr;}

37

38 main()

39 {

40 Array Arr1(10), Arr2;

41 double x;

42 for(unsigned i=0;i
43 {

44 x=double(i);

45 x=x*x-5*x+10;

46 Arr1.store(x,i);

47 }

48

49 Arr2.store(33.2);

50

51 for(i=0;i
52 cout << "Arr1["<
53

54 cout << "Arr2.size= "<< Arr2.getSize ()<<"n"

55 << "Arr2.dataPt*="<
56

57 return 0;

58 }

该程序的运行结果如图 2.1 所示。



图 2.1 【源程序2-1】的运行结果

程序说明:

(1) 第4~21 行完成了Array 类的定义(也叫类声明),该类的成员包含两个成员变量(Member Varable)dataPtr,size 和5 个成员函数(Member Function),第23~37 行完成了类的实现,即成员函数函数体的代码实现,第38~58 行是这个类的应用。

(2) 在OOP 中有一到多个与类名同名的成员函数称为构造函数(Constructor),第10~11行是Array 类的两个构造函数的声明,第23~34 行是这两个构造函数的代码实现。

(3) 在OOP 中有一个与类名同名左上角有“~”符号的成员函数称为析构函数(Destructor),第12 行是Array 类的析构函数的声明,第35~37 行是这个析构函数的代码实现。

(4) 第23 行行首的“Array::”表示下面第24~27 行的代码段属于类Array 的成员函数实现或成员变量初始化代码,“::”称为作用域消解符。

(5) 第40 行应用Array 类生成了两个类实例(Instance)——Arr1 和Arr2。实际上,类可以看做是一种自定义数据类型,能够像预定数据类型一样生成和初始化变量,例如int A=5,这里A 称为整型变量,而第40 行,Array Arr1(10)中的Arr1 称为类生成的Array 型变量,规范叫法称Arr1 是Array 类的一个实例,也有些不规范的叫法称Arr1 是Array 类的一个对象。

(6) 构造函数是用来初始化类实例的,即为类实例申请基本系统资源。在执行第40 行Array Arr1(10)时,系统会用所给的参数10 自动调用与其参数匹配的第23~27 行的构造函数,即执行构造函数体中的代码,完成:

InitSize=10 //为构造函数和形参赋值

Array(InitSize=10) //以形参值作为参数调用构造函数



Arr1.size=(InitSize=10) //为类实例Arr 的成员变量size 分配一个整型存储

//单元并用形参InitSize 的值10 初始化该存储单元

Arr1.dataPtr=new double(10) //为类实例Arr 在动态内存区开辟10 个连续的

//double 型存储单元,并把首地址赋给Arr 的成员变量dataPtr


构造函数在正常完成类实例 Arr1 的初始化后,Arr1 就被用来标识和操纵为其所分配的系统资源,就可以像普通变量一样在作用域内被使用和操作。

(7) 第42~47 行通过循环对类实例Arr1 进行操作,第42 行,Arr1.GetSize()调用成员函数GetSize 访问到Arr1 的成员变量size 的值是10;第46 行,Arr1.store(x, i)调用成员函数store,通过查看类定义和实现代码的第16~17 行可以看出,该成员函数完成对dataPtr 所指向的连续存储单元的数值存储;第52 行,Arr1.recall(i)调用成员函数recall,通过查看类定义和实现代码的第19~20 行可以看出,该成员函数完成对dataPtr 所指向的连续存储单元值的访问。

(8) 第40 行定义的类实例Arr1 与第41 行的普通变量x 一样,也有作用域的约束,即超出作用域后变量的值变得不可访问或占用的系统资源被系统强制收回。本例中Arr1 的作用域是从第40 行开始,到57 行结束。OOP 标准规定,类实例在超出作用域时,系统会自动调用该类的析构函数以协助系统完成对该类实例所占用系统资源的释放和回收。本程序在执行完第57 行退出之前,由于Arr1 恰好在此超出作用域,所以系统会自动调用和执行Arr1.~Array()函数,以完成对Arr1 所占用的系统资源的释放和回收,即完成对类实例Arr1 的析构。从Array 类的析构函数的实现代码(第36 行)可以看出,此析构函数完成了对类实例通过构造函数在动态存储区分配的10 个double 型连续存储单元的释放,其他相关析构工作,例如,在自动存储区通过预定义double 数据类型声明和生成的成员变量Arr1.size 等的释放和回收,遵从系统对变量和存储区的管理规则自动释放和回收。本教程来自网站源代码:http://www.isstudy.com

(9) 通过本样板程序可以看出,析构函数执行与构造函数相反的任务,即构造函数是在生成类实例时(如第40 行,Array Arr1(10);)带上类实例的参数被系统自动调用的,完成类实例的初始化并为其申请基本系统资源;而析构函数是在类实例超出作用域时由系统自动调用的,完成对该类实例所占用系统资源的释放与清理等操作。

(10) 由于本样板程序比较简单、小巧,所以就把类定义、类实现与类应用都放在了一个文件中。在实际开发中,通常把类定义和短小的成员函数实现放在扩展名为.h 的头文件中,类的实现代码放在扩展名为.cpp 的代码文件中。如果是比较复杂的大型的类,一般可以将每个类都单独放在以类名命名的头文件和实现文件中,如在本例中就可以将第1~22 行放在Array.h文件中,第23~37 行放在Array.cpp 文件中,第38~58 行放在ArrayTest.cpp 文件中,文件间通过头文件包含、项目(工程)文件,甚至二进制动态链接库建立关联,生成可执行文件,清晰地划分类定义、类实现和类应用代码,以便于大型系统的开发与维护。

(11) OOP 的类通过使用成员变量刻画属性、成员函数刻画行为的方式定义一族具有相似属性与行为的客观事物的描述框架。本例中的Array 类就是一族包括元素个数和元素值型的数组描述框架,其属性包括int 型的元素个数(size)和用来存放size 个元素的double 型连续存储空间(dataPtr),行为包括获得数组元素个数的操作getSize()、数组元素赋值的操作store()和数组元素值查看的操作recall()。类实例就是现实世界中具有属性与行为的客观对象在计算机中的存在,除了如第40 行生成类实例Arr1、Arr2 外,还可以根据需要生成任意多个数组实例,如 Array Arr3(8)、ArrB(1000)等。




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759