程序开发网站中什么类,类的定义

第六讲:类、对象的简单应用及類封装、隐蔽性

掌握:类成员函数的简单应用用类来设计程序。
理解:公用接口、私有接口、类中的方法、“消息”的概念
重点、难點: 类成员函数的简单应用,用类来设计程序

一、类和对象的简单应用举例(前两个为成员数据;后两个为成员函数)

    (2)不要错写为类名,如写成Time.hourTime.minute,Time.sec是不对的因为类是一种抽象的数据类型,并不是一个实体也不占存储空间,而对象是实际存在的实体是占存储涳间的,其数据成员是有值的可以被引用的。 
    (3)如果删去主函数的3个输入语句即不向这些数据成员赋值,则它们的值是不可预知的读鍺可以上机试一下。

例2 引用多个对象的成员
    若有多个对象,需要分别引用多个对象中的数据成员可以写出如下程序:

    程序是清晰易懂嘚,但是在主函数中对不同的对象一一写出有关操作会使程序冗长,如果有10个对象那么主函数会有多长呢?这样会降低程序的清晰性,使阅读困难为了解决这个问题,可以使用函数来进行输入和输出见程序(b)。

运行情况与程序(a)相同

    本程序在类外定义函数set_time和show_time。函数set_time用来給数据成员赋值函数show_time用来显示数据成员的值。函数的形参t是Time类对象的引用变量当主函数调用函数set_time(t1)时,由于set_time函数中的形参t是引用变量洇此它与实参tl共占同一段内存单元(所以说t是u的别名),执行set_time函数相当于执行以下语句,向tl中的hourminute和sec输入数值。
注意:在程序中对t1和t2的定义昰分别用两个语句完成的并未写在一行上。C语言要求所有的声明必须集中写在本模块的开头因此熟悉c语言的程序编写人员往往养成一個习惯,把所有声明集中写在本模块的开头但是在C++编程中并不提倡这样做。在C++中声明是作为语句处理的,可以出现在程序中的任何位置因此,C++的编程人员习惯不把声明写在开头而是用到时才进行声明(如同本程序那样),这样程序比较清晰阅读方便。

    可以对上面的程序作一些修改数据成员的值不再由键盘输入,而在调用函数时由实参给出并在函数中使用默认参数。将程序(b)第8行以下的部分修改为:

time函數时指定了默认参数在定义set_time函数时不必重复指定默认参数。如果在定义函数时也指定默认参数其值应与函数声明时一致,如果不一致编译系统以函数声明时指定的默认参数值为准,在定义函数时指定的默认参数值不起作用例如将定义settime函数的首行改为:    void

运行情况与例2.2Φ的程序(a)相同。

例4 找出一个整型数组中的元素的最大值

    这个问题可以不用类的方法来解决,现在用类来处理读者可以比较不同方法的特点。 可以编写出以下程序:

    请注意成员函数定义与调用成员函数的关系定义成员函数只是设计了一组操作代码,并未实际执行只有茬被调用时才真正地执行这一组操作。
    可以看出:主函数很简单语句很少,只是调用有关对象的成员函数去完成相应的 操作。在大多數情况下主函数中甚至不出现控制结构(判断结构和循环结构),而在成 员函数中使用控制结构在面向对象的程序设计中,最关键的工作昰类的设计所有的 数据和对数据的操作都体现在类中。只要把类定义好编写程序的工作就显得很简单了。

二、类的封装性和信息隐蔽

1、公用接口与私有实现的分离

    1、C++通过类来实现封装性把数据和与这些数据有关的操作封装在一个类中,或者说类的作用是把数据和算法封装在用户声明的抽象数据类型中。在面向对象的程序设计中在声明类时,一般都是把所有的数据指定为私有的使它们与外界隔离,把需要让外界调用的成员函数指定为公用的外界通过公用的函数来实现对数据的操作。外界与对象惟一的联系渠道就是调用公用的成員函数这样就使类与外界的联系减少到最低限度。
    2、在声明了一个类以后用户主要是通过调用公用的成员函数来实现类提供的功能(例洳对数据成员赋值,显示数据成员的值对数据进行加工等)。因此公用成员函数是用户使用类的公用接口(pubic interface),或者说是类的对外接口当嘫并不一定要把所有成员函数都指定为public(公用)的,但非public的成员函数就不是公用接口了在类外虽然不能直接访问私有数据成员,但可以通过調用公用成员函数来引用甚至修改私有数据成员的值
    3、用户可以调用公用成员函数来实现某些功能,而这些功能是在声明类时已指定的用户可以使用它们而不应改变它们。实际上用户往往并不关心这些功能是如何实现的细节而只需知道调用哪个函数会得到什么结果,能实现什么功能即可如同使用照相机一样,只需知道按下快门就能照相即可不必了解其实现细节,那是设计师和制造商的事
    4、照相機的快门就是公用接口,用户通过使用快门实现照相的目的但不能改变相机的结构和功能。一切与用户操作无关的部分都封装在机箱内用户看不见,摸不着改不了,这就是接口与实现分离

    通过成员函数对数据成员进行操作称为类的实现,为了防止用户任意修改公用荿员函数改变对数据进行的操作,往往不让用户看到公用成员函数的源代码显然更不能修改它,用户只能接触到公用成员函数的目标玳码可以看到:类中被操作的数据是私有的,实现的细节对用户是隐蔽的这种实现称为私有实现(pnvate implementation)。这种“类的公用接口与私有实现的汾离”形成了信息隐蔽
    软件工程的一个最基本的原则就是将接口与实现分离,信息隐蔽是软件工程中一个非常重要的概念它的好处在於:
    (1)如果想修改或扩充类的功能,只需修改奉类中有关的数据成员和与它有关的成员函数程序中类外的部分可以不必修改。例如想在聲明的student类中增加一项数据成员“年龄”,只需这样改:

    注意:虽然类中的数据成员改变了成员函数display的定义改变了,但是类的对外接口没囿改变外界仍然通过公用的display函数访问类中的数据。程序中其他任何部分均无需修改当然,类的功能改变了在调用stud对象的display时,输出该學生的学号、姓名、年龄和性别的值
    可以看出:当接口与实现(对数据的操作)分离时,只要类的接口没有改变对私有实现的修改不会影響程序的其他部分。对用户来说类的实现方法的改变,不会影响用户只要保持类的接口不变即可。譬如软件开发商想对以前提供给愙户的类库进行修改升级,只要保持类的接口不变即用户调用成员函数的方法(包括函数参数的类型和个数)不变,用户的程序就不必修改

    (2)如果在编译时发现类中的数据读写有错,不必检查整个程序只需检查本类中访问这些数据的少数成员函数。这样就使得程序(尤其是夶程序)的设计、修改和调试都显得方便简单了。

2、类声明和成员函数定义的分离

    如果一个类只被一个程序使用那么类的声明和成员函数嘚定义可以直接写在程序的开头,但是如果一个类被多个程序使用这样做的重复工作量就很大了,效率就太低了
    在面向对象的程序开發网站中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中用户如果想用该类,只要把有关的头文件包含进来即可不必在程序中重复书写类的声明,以减少工作量节省篇幅,提高编程的效率
    由于在头文件中包含了类的声明,因此在程序中就可以鼡该类来定义对象由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中而另外放在一个文件中。

    可以按照对多文件程序的编译和运行方法对程序进行编译和連接C++编译系统对两个源文件main.cpp和student.cpp分别进行编译,得到两个目标程序main.obj和student.obj(目标文件的后级在不同的C++编译系统中是不同的例如在GCC中,后缀是.o这里用.obj是对一般目标程序而言的。)然后将它们和其他系统资源连接起来,形成可执行文件main.exe

    在执行主函数时调用stud中的display函数,输出各数据成员的值这只是一个程序的框架,在Student类中包括了数据成员namname和sex,但是并没有对stud对象中的数据成员赋值程序虽能通过编译并可以運行,但输出的值是不可预知的、无意义的请读者对以上程序框架作必要的补充(可以在Student类中增加一个对数据成员赋值的set函数)。
   可能会考慮这样一个问题:如果一个类声明多次被不同的程序所选用每次都要对包含成员函数定义的源文件(如上面的student.cpp)进行编译,这是否可以改进呢?的确可以不必每次都对它重复进行编译,而只需编译一次即可把第一次编译后所形成的目标文件保存起来,以后在需要时把它调出來直接与程序的目标文件相连接即可这和使用函数库中的函数是类似的。
    这也是把成员函数的定义不放在头文件中的一个好处如果对荿员函数的定义也放在类声明的头文件中,那么在对使用这些类的每一个程序的每一次编译时都必然包括对成员函数定义的编译,即同┅个成员函数的定义会多次被重复编译只有把对成员函数的定义单独放在另一文件中,单独编译才能做到不重复编译。
    在实际工作中并不是将一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起形成类库。类库有两种:一种是C++编译系统提供的标准类库;
    一种是用户根据自己的需要做成的用户类库提供给自己和自己授权的人使用,这称为自定义类库在程序开发网站工作Φ,类库是很有用的它可以减少用户自己对类和成员函数进 行定义的工作量。
类库包括两个组成部分:(1)类声明头文件;(2)已经过编译的成員函数的定义它是目标文件。用户只需把类库装入到自己的计算机系统中(一般装到c++编译系统所在的子目录下)并在程序中用#include命令行将有關的类声明的头文件包含到程序中, 就可以使用这些类和其中的成员函数顺利地运行程序。
这和在程序中使用c++系统提供的标准函数的方法是一样的例如用户在调用sin函数时只需将包含声明此函数的头文件包含到程序中,即可调用该库函数而不必了解sin函数是怎么实现的(函數值是怎样计算出来的)。当然前提是系统已装了标准函数 库。在用户源文件经过编译后与系统库(是目标文件)相连接。
    在用户程序中包含类声明头文什类声明头文件就成为用户使用类库的有效方法和公用接口,用户只有通过头文件才能使用有关的类用户看得见和接触箌的是这个头文件,任何要使用这个类的用户只需包含这个头文件即可包含成员函数定义的文件就是 类的实现。请特别注意:类声明和函数定义一般是分别放在两个文件中的
    由于接口与实现分离,就为软件开发商向用户提供类库创造了很好的条件开发商把用户所需的各种类的声明按类放在不同的头文什中,同时对包含成员函数定义的源文件进行编译得到成员函数定义的目标代码。软件商向用户提供這些头文件和类的实现的目标代码(不提供函数定义的源代码)用户在使用类库中的类时,只需将有关头文件包含到自己的程序中并且在編译后连接成员函数定义的目标代码即可。用户可以看到头文件中类的声明和成员函数的原型声明但看不到定义成员函数的源代码,更無法修改成员函数的定义开发商的权益得到保护。
    由于类库的出现用户可以像使用零件一样方便地使用在实践中积累的通用的或专用嘚类,这就大大减少了程序设计的工作量有效地提高了工作效率。

3、面向对象程序设计中的几个名词

    1、方法:类的成员函数在面向对象程序理论中被称为“方法”(method)“方法”是指对数据的操作。一个“方法”对应一种操作显然,只有被声明为公用的方法(成员函数)才能被對象外界所激活

    2、消息:外界是通过发“消息”来激活有关方法的。所谓“消息”其实就是一个命令,由程序语句来实现前面的stud.display();就是向对象stud发出的一个“消息”,通知它执行其中的display“方法”(即display函数)

    3、对象:客观世界中任何一个事物都可以看成一个对象(object)。对象可夶可小;可以是自然体也可以是逻辑体;对象可以嵌套;对象有两个要素:静态特征称为属性(attribute)动态特征称为行为(behavior)。5、控制行为改变的因素称之為消息要使某一个对象实现某一种行为(即操作),应当向它传送相应的消息

【课程类型】专业核心能力课程

【授课对象】软件技术专业

技术实现网站的动态交互功能采用“项目驱动,案例教学”的教学模式开展教

、课程任务:本课程理论与技能培养并重相互结合,为培养动态网站和

系统的应用型人才而设立

编程能力,从而能够运用

程序设计课程学习学生能熟练地掌握必偠的

应用软件及网站的能力。

而这些能力是从事软件技术行

业就业岗位最为重要的基本能力

我要回帖

更多关于 程序开发 的文章

 

随机推荐