《C++程序设计教程》课件第1章_第1页
《C++程序设计教程》课件第1章_第2页
《C++程序设计教程》课件第1章_第3页
《C++程序设计教程》课件第1章_第4页
《C++程序设计教程》课件第1章_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.1概述

1.2C++入门

1.3类的基本概念

1.4现实生活中的类与对象

1.5程序的具体实现

1.6this指针

1.7作用域、可见性及命名规则1.8C++程序结构

本章要点

练习

1.软件设计方法的发展

软件开发早期采用结构化程序设计方法,程序被理解为:程序=(算法)+(数据结构)。即算法和数据结构是各个独立的整体,分别进行设计。1.1概述随后,软件工程师们开始逐步注重系统整体关系的表示和数据模型技术,他们把数据结构与算法看做一个整体的功能模块,于是程序被重新认识为:程序=(算法+数据结构)。即算法与数据结构是一个整体,算法总是离不开数据结构,算法含有对数据结构的访问。一个算法只能适用于特定的数据结构,想设计一个适合于访问多个数据结构的算法是不明智的,而且数据结构由多个算法来对其进行同种操作也是多余的。

此后,面向对象的程序设计方法被提出并获得了发展。

2.面向对象语言的特征

在面向对象程序设计中,算法与数据结构被捆绑成一个“类”,类进一步具体化为实物,即对象。于是程序被进一步理解为:程序=(对象+对象+…),对象=(算法+数据结构)。现实世界本身就是一个对象的世界,任何对象都通过它的属性和行为体现出来。即程序就是许多对象在计算机中相继表现的体现。从这样的角度看问题,我们在开发程序时就不用为程序功能如何实现而费尽心机了,而只要通过对象的组合就可以轻易实现。面向对象程序设计思想突破了软件思想的障碍,使得程序规模迅速扩大,软件产业得以飞速发展。面向对象程序设计是软件设计方法发展的必然结果。

C++是一种流行的面向对象的程序设计语言。它通过类机制,最有效地实现了面向对象的原理。它使得我们能从真实客观的角度来理解和开发应用程序。因此,可以说C++是类机制比较完善的一种高级语言。

3.C++和C

C++是一种高效实用的程序设计语言,它同时兼有面向过程和面向对象程序设计,因而得到了广泛应用。C++从C进化而来,是C语言的超集,C中的语法规则在C++中都适用。C++也可以说是C的增强版,所以在名字中使用了C语言中的自增量运算符++,而形成C++。但是,C++并不是C语言的简单扩充,而是一个本质性的变革。它在继承C语言优点的基础上,提供了面向对象程序设计的能力。C++是一门优秀的、高效实用的、具有发展前途的程序设计语言。学好C++,很容易触类旁通地学好其他程序设计软件。

1.输入与输出

C++有许多自己的特性,其中之一是将输入/输出改进为I/O流。例如,cout<<2就是将2这个数据送给显示器,cin>>a就是从键盘读取数据赋给a。cout和cin都是关键字。标识符cout代表屏幕,运算符<<用于把内容放进输出流,即将数据送到显示器。若有语句cout<<"IlearnC++";,执行该语句之后就能在显示器上看到“IlearnC++”。1.2C++入门输出后若要换行可以使用语句cout<<“IlearnC++”<<endl;,endl的作用是换行并刷新输出流。用cout<<的方式输出数据时,对于基本数据类型,它能自动匹配一种合适的类型输出,所以输出时不必再指出数据类型。标识符cin代表键盘,提取运算符>>用于把内容放进输入流,即把从键盘敲入的数据送到给定的单元中。

C++规定,凡使用输出流和输入流的程序,要用#include<iostream.h>包含头文件。这部分内容详见第8章。

2.标识符

在C++中,将由程序员命名的各名称,如变量名a等都称为标识符。在命名标识符时要注意几点:第一,标识符要以字母或下划线开头,后接由字母、数字或下划线组成的字符序列;第二,命名标识符时,不能使用已被系统定义的关键字;第三,可用大小写字符来区别不同的标识符。

表1-1列出了C++中的关键字。表1-1C++中的关键字1.3.1从结构到类

有一个学生的部分信息如图1-1所示,在C中可以用结构体类型描述如下:

structstudent

{longnum;

charname[20];

intscore;

};

structstudentstu;1.3类的基本概念图1-1结构组成上面的描述在C中定义了一个student的结构体,并定义了一个该结构体的变量stu。在C++中也有结构的概念,如:

structstudent

{longnum;

charname[20];

intscore;

};

studentstu;比较这两种方法,对于同样的定义,C++的描述只不过少了关键字struct。在C++中我们认为该描述定义了一个student的结构体,并定义了一个该结构体的对象stu。stu就是一个学生对象,学生是人,当然会有一些行为。为了表现行为,在C++中的结构体内还可以定义函数,用它可以实现某一功能。接上题描述一个学生的情况,并增加学习行为,在C++中用结构体的方法可描述如下:

structstudent

{longnum;

charname[20];

intscore;

voidStudy();

};

studentJonas;该描述定义了一个名叫student的结构体,并定义了一个该结构体的对象Jonas。于是就可用Jonas.score=5;进行赋值,用Jonas.Study()来调用成员函数表现行为。这两个语句的语意可描述为:Jonas得到了5个学分,Jonas去学习。

在C++的结构体中可以定义函数。我们将结构内定义的函数称为成员函数,通过它可以实现某种功能来表现行为。在C中,结构体内的成员是公开的,在结构体外部通过变量名引导就可以对成员进行访问,这样就很难保证数据的安全。为了能对结构体内成员的访问有所限制,C++中引入了“类”的概念。所谓“类”,是把事物的数据和与之相关的功能封装在一起,形成一种特殊的结构体,用以表示真实事物的一种抽象概念。在C++中定义类的关键字用class而不用struct。C++中的类是struct的一种形式。类是C++语言中的一种数据类型,它既可以包含描述事物特征的数据,又可以包含表现这些特征的函数。在类中的成员允许有public(公有的)、private(私有的)和protected(保

护的)。

在面向对象程序设计方法中,程序是通过对象的表现来实现的,而对象的所有行为和特征都是由类来决定的。因此要建立对象,首先必须定义类。定义类的一般方法如下:

class类名

{private: //标识成员的性质

私有成员

public:

//标识成员的性质

公有成员

};关键字class和类名组成类头,类名的命名要符合标识符的规定,通常第一个字母要大写。类的定义体用“{”和“}”括住,可将它称为类体。类体中是类成员表。右括号后加分号“;”,作为类定义的结束标记。一个类就是由用户定义的一个新增类型,这个类型并不“抽象”,我们对它的使用就像使用int和float一样简单。在上面的定义方法中,“//”之后的文字是注释,对程序的执行不起作用,但可以帮助理解程序。在上面的描述中,类名Student代表的是一个新增数据类型,可以通过它来定义对象。对象的定义方法与我们用内部类型定义变量的方法一样。例如:

voidmain()

{StudentJonas;}//定义了一个Student类的对象Jonas

引入类的概念之后,我们可以把学生信息重新描述为:定义了一个学生类Student,并在主函数中定义了一个该类的对象Jonas。1.3.2属性与行为

类的描述主要由属性和行为两部分组成。属性用于描写个性,由数据成员来完成。行为用于实现某一功能,由成员函数来完成。行为(函数)publicStudy(intx)属性(数据)privatenum、name[20]、score图1-2属性和行为

在C++中定义类时并不分配内存单元,只有定义了类的对象之后才分配内存单元。在例1-1中定义了一个类Student,并通过该类定义了一个对象Jonas,这时就在内存中开辟了一片空间,如图1-2所示。有了内存空间,就可以对该空间的数据进行存取等操作了。

用private和public可将类的成员分为私有和公有两个区。private区的成员具有私有性,类的外部不能访问它们;public区的成员具有公有性,类的外部可以对它们进行访问。我们将private、public等称为访问控制说明。图1-2属性和行为类中的所有成员只能是成员函数或数据成员。类的行为由成员函数来实现,类的特征由数据成员来表现。在上面的类定义中,Student类有学号、姓名和成绩三个特征,有学习课程的行为,并通过学习累积学分。

在主函数中定义了一个Student类的对象Jonas。整个学生是一个群体,是一个学生类,而Jonas是学生中的一个对象,是学生中的一员。Jonas有统计学分的行为,该行为是公有的,同时他还有学号、姓名、成绩等私有属性。1.3.3封装与隐藏

1.类的封装

类的封装就是标识成员的访问控制说明,即指定某成员具有public(公有的)、private(私有的)或protected(保护的)性质。类的这一要求称为类的封装性。在完成了封装后,对于说明为public的成员,类的外部可以对它们进行访问和操作;对于私有或保护成员,类的外部不能对它们进行访问,只有该类的成员函数才有权对它们进行访问。对于不指定访问控制说明的成员,默认其封装性为private。

2.封装的作用

类有许多特性和方法,用户不需要全部了解,也能很好地实现其功能,这就如我们并不需要了解电视机的内部结构,只需通过一些按钮便可使它发挥作用一样。生产厂将内部实现技术与外部接口自成于一体,这种自成一体性,称为封装。经过封装,用户通过接口使类发挥作用,既保护了内部元器件,又有利于技术保密。因此,封装的作用就是有选择地隐藏类中的特性和方法。通过封装有选择地隐藏类中的特性和方法,将类的一些数据成员声明为私有以及通过公有成员函数对它们进行访问,有助于保护它们的完整性。

C++定义的类具有封装性。正确的类定义一旦建立,就可以将类看做是完成封装的实体,可以作为一个整体单元被使用。通过公有接口也就是成员函数,对类属性实现有效的和有限的访问,既使类发挥了功效,又使类得到了可靠的保护,这就是封装的作用。

在C++中,成员函数的行为是由程序员规定好的,只能完成预定的功能,其他想通过成员函数来对被封装的数据成员进行破坏的行为都不被理睬。这一封装特性正是C++符合软件工程理论的又一精妙之处。

3.封装的目的

(1)相对于外部函数(普通函数或其他类的成员函数)而言,使类内部的保护和私有成员不被肆意更改。

(2)只有类的成员函数才能访问保护或私有成员,使类具有自身的维护功能。

(3)限制类的外部接口,把类分成两部分,一部分是公有的,一部分是保护的。

(4)减少类与其他代码的关联程度。可以类比一下我们家中的电脑,它由接口、键盘和主机箱等组成。接口和键盘是public的,允许我们使用,而主机箱内是protected或private的,除维修人员以外是不能打开的。这样做的好处是主机箱内部的元器件可以不被肆意拆卸,减少了许多麻烦。通过接口、键盘和鼠标等,我们可以正确地使用电脑的功能。而接口、键盘和鼠标的功能是有限的,对它们的使用一般不会造成主机箱内元件的损坏。通常我们所说的对象就是现实世界中的实体。比如我们每一个人就是一个对象。人有大脑、眼睛、鼻子、耳朵和手等。人还会有一些行为,如行走、工作和思考等。除了具有上面列举的共同特性之外,每一个人还有自己的姓名、年龄和身高等。

把具有相同特性的对象进行抽象,归并在一起,就可以用“类”的概念来描述。比如在描述人时,先要描述人类。首先说明人类是什么,然后说一个具体的人就是其中的一员,即一个对象。这种方法用程序设计的语言来描述就是先定义类,然后由类来定义对象。1.4现实生活中的类与对象1.4.1类的描述

C++使得我们能从真实客观的角度来理解、开发应用程序,这就要求程序设计应当是现实世界的体现。

比如描述汽车类,首先区分哪些是汽车的行为,哪些是它的特征。汽车的型号、生产厂和发动机等是特征,汽车的载客、行驶和制动等是行为。因为我们不希望汽车用户改变型号、生产厂等,所以可将它们作为汽车类的私有数据成员。汽车的价值是供人使用,因此要将汽车的载客、行驶等作为汽车类的公有成员函数。类的外部可以对这些公有成员函数进行访问,以便能表现它的行为。1.4.2类与对象

现实世界中的对象不仅有共性也有个性。我们如何将现实世界中的对象转化为程序中的对象呢?即对于现实世界中的对象,如何在程序中表现出来呢?在本节中就要解决这个问题。程序中的对象也就是编程对象,它就是将对象的特性与行为组合在一起得到的结果。

1.编程中的类

程序设计的目的就是要解决实际问题。下面描述现实生活中的对象——人,并将他转换为编程对象。类是一个抽象的概念,对象才是一个客观的实体。例如,人类就是一个类,它可以有具体实物,就是人,这个人就是人类的对象。人有身高体重,并占有一定的空间。

2.编程中的对象

现实生活中的对象是生产、制造或生养出来的,程序中的对象要由类来定义。在程序中要定义对象,先要定义类,再通过类定义对象。类对所定义对象的数量并没有限制。

现在用程序设计语言来描述一个学生对象。

3.代码解释

在例1-2中,Student就是一个类,它具有所有学生的共同特征和行为。该类有Student、Study和Display三个成员函数,它们就是Student类对象所具有的行为。函数的具体实现就是它的行为能力。目前三个函数所做的事分别为初始化、累积学分和显示成绩。该类有num、name和score三个成员,它们就是Student类对象的特征,分别描述了学号、姓名和成绩,称为数据成员。

publicStudent()、Study(intx)、Display()、noprivatenum、name[20]、score在main函数中用StudentJonas; 定义了一个Student类的对象Jonas,内存空间分配如图1-3所示。Jonas就是学生中的一员,于是就具有Student、Study和Display的行为能力以及num、name和score特征。

在类中,因为成员函数是public,所以在类的外部可用对象名和分量运算符“.”来访问成员,如Jonas.Display();或Jonas.no=223;。对于Jonas的private成员,就不能用对象名加分量运算符来访问,即若用Jonas.num=2007; 就出错。图1-3结构示意图

4.访问控制

在类的定义中,成员函数往往是类的共性,是类的所有对象共同具有的行为,所以将它们声明为public,这样便于类的所有对象访问它们。也就是说,在类的外部能指挥对象,使其完成某种操作。类的数据成员往往是对象的个性与特征,一般声明为private或protected。对于private或protected成员,类的外部是不能对它们进行访问的,只有通过类的成员函数才可访问。在面向对象程序设计中,程序被描述为:程序=(对象+对象+…),即程序就是许多对象在计算机中的相继表现。

对象=(算法+数据结构)表明一个对象就是一个程序实体。对象是由类来定义的。1.5程序的具体实现1.5.1定义成员函数

C++的类中有成员函数和数据成员两大部分。在类定义中,类的行为由函数来实现,称此函数为成员函数。类的特征用非函数形式来表现,称其为数据成员。将类中函数称为成员函数的含义是:其一,它是类中的成员;其二,它是函数,它能访问类中的所有成员。成员函数的主要任务是,实现对对象的数据成员的操作。成员函数建立了类的内部与外部有限联系的桥梁。成员函数一般都声明为公有的,这些公有成员函数在程序设计中被称为类的接口。类的使用者用这些接口操作类的所有数据成员。

在C++中有两种方法来定义成员函数:在类中直接定义成员函数;分别定义,即先定义类,然后再定义成员函数。

2.分别定义

所谓分别定义,就是在定义类之后再定义成员函数。分别定义时,必须指出该成员函数属于哪个类。因此,定义成员函数的一般方法是:

返回类型类名::函数名(参数表){函数体}

其中,::称为域区分符。在上述代码中用到了域区分符::,它在这里是双目运算符,指明该函数或数据属于哪个类。当用分别定义的方法定义成员函数时,就要使用域区分符。

域区分符还可作为单目运算符使用。此时它的作用是,使得被屏蔽的全局对象在它的作用域内重现。该用法是C++中新增的内容。在C中,在全局对象(包括变量、函数等)的作用域内一旦定义了同名的局部对象,就将全局对象屏蔽而不可见。在C++中我们可以用域区分符::使被屏蔽的全局对象可见。使用方法是,在数据或函数前加::,表示该数据或函数是全局数据或全局函数,而非成员。请看下面的例子。本例中定义了三个全局变量month、day和year。在它们的作用域内,函数Set中又定义了同名变量,将原变量屏蔽。所以在Set函数体中,若要访问数据成员,就直接给出变量名,若要访问被屏蔽的全局变量,就要加域区分符::。同样地,在函数Set的作用域内,类Tdate中又定义了同名函数Set,将原函数屏蔽。因此在成员函数Set中要访问被屏蔽的函数Set时就要加域区分符::。

3.接口与实现相分离

上面提供的两种定义成员函数的方法在本质上是一种方法,即类的定义和成员函数的定义在同一个文件中。将类的定义和其成员函数的定义分为两个文件,然后再用包含文件建立联系,这是目前开发程序常用的做法。我们把类定义看成是类的外部接口。由于接口的连接是通过成员函数来实现的,因此把类的成员函数定义看成是类的内部实现。我们称这一方法为接口与实现相分离。经分离后,包含类定义的部分称为头文件,包含成员函数定义的部分称为实现文件。然后再用包含文件建立联系,将它们编译连结成一体。例1-3先建立一个名叫stu.h的头文件,将所有类定义都放入其中,再建立一个名叫stu.cpp的实现文件,并用#include“stu.h”将头文件包含到实现文件内。

在头文件中用到的#ifndefSTUD_H、#defineSTUD_H…#endif是预处理代码,其作用是防止该头文件被多次包含。在开发一个大型程序时常使用该方法。

4.接口与实现相分离的评价

接口与实现相分离有利于软件公司将类库作为商品。在该商品中只提供头文件和目标模块,并不公开内部实现。这种技术被称为信息隐藏。用户只要用包含头文件的方法就能使用该类库,这样既有效地保护了开发者的知识产权,又实现了资源共享。我们推荐采用接口与实现相分离的方法。这样做的好处主要有:

(1)保护知识产权。通过分离可将类内部的特性和方法隐藏起来,用户不需要知道也无法知道类是如何工作的,只需要了解其外特性和外部操作就能有效并安全地使用类,使其发挥功效,实现共享与保密的统一。

(2)高效与方便。当由于某种原因需要改变类的内部私有实现代码时,只要接口不变就不会影响到类的用户。1.5.2调用成员函数

在类定义中声明的成员名以及类的数据成员或成员函数,都属于类的作用域。在类的作用域内,类的成员之间可以直接互访。在类的作用域外只能访问公有成员,且要有对象名引导。一般情况下,成员函数总是声明为公有,数据成员声明为私有或保护。

对于实施封装后的类,外部不能对其保护或私有成员进行直接访问。对类中数据成员的访问,要通过成员函数来完成。成员函数是类的接口。成员函数属于某个类或对象,所以当要调用成员函数时必须指明隶属关系,即要用类或对象来引导,或者用指向某对象的指针来引导。

调用成员函数分为在类的内部调用和在类的外部调用两种情况。在类的内部调用是指在成员函数中调用同一类的另一个成员函数,此时可以直接进行,不需要使用点“·

”运算符。在类的外部调用成员函数的方法可有如下几种。

1.用对象引导

用对象引导调用成员函数的形式类似于访问一个结构体对象的分量,先指明对象,再指明成员,即以对象加上点“·

”操作符和成员函数的形式访问,如下面例1-4中的t1.Set(2002,1,28)。

2.用类名引导

采用类名引导的方法调用成员函数要求类名与域区分符结合使用,即类名::成员函数。用这种方法访问类的成员函数的具体内容将在第3章和第7章中介绍。

3.用指针访问

通过类的指针也可以访问成员函数,方法是:先定义一个类的指针,用指针指向对象,然后用该指针调用成员函数,如例1-4中的p->play()。

4.用引用传递

用引用传递来访问成员函数是指用对象的引用来调用成员函数,这看上去和使用自身的简单情况一样。这部分内容将在第4章中介绍。运行结果:

Thedateis:2002 1 28

Thedateis:2002 11 5

Thedateis:2002 1 28

w=2

Thedateis:2002 11 5

在例1-4中定义了Tdate类并对它进行了封装;定义了一个与Tdate类成员函数同名的普通函数Set。例1-4演示了三种成员函数的访问方法。第一种,通过对象名,如t1.Set(2002,1,28)和t2.Set(2002,11,5);第二种,通过类的指针,如p->play();第三种,在类的成员函数内访问该类成员函数,如Tdate::Set()中的play()。在类的成员函数中对类的所有成员的访问没有限制。

普通函数Set不能访问Tdate类中的private成员,但可以访问类中的公有数据成员。访问方法为对象名加分量运算符加公有成员名。如例1-4中的t2.week=18和Set()中的t.week=w。1.6.1成员函数和数据成员的关系

通过类来创建一个或多个对象时,这些对象都有各自所占有的空间,它们在内存中的分布情况是:每个对象都会自动生成一份表现自我特征的数据成员拷贝,并独占某一片空间。而成员函数只有一份拷贝,它由该类所有的对象共享。也就是说,同类的各对象都能得到一份数据成员的拷贝,这些拷贝属于各个对象所有,彼此之间不能共享;而成员函数仅有一份,它为各个对象所共享。

同一个类的各对象的成员函数和数据成员的关系如图1-4所示。1.6this指针图1-4成员函数和数据成员的关系从图1-4可知,当创建多个对象时,有多份数据成员的副本,而只有一份成员函数的副本,也就是我们常说的一对多的关系。那么成员函数如何区分数据成员是哪个对象的呢?1.6.2this指针的作用

某个类定义了多个对象,为了节省空间,在该类的各个对象中有多份数据成员的拷贝,只有一份成员函数,它是各对象共有的。这唯一的一份成员函数要供该类的所有对象共同使用,C++通过引入this指针来区分各对象的数据成员。1.6.3this指针的工作方式

每个对象都有一个指向自身的指针——this指针。在引用对象内部成员时,this指针是一个隐含的参数。关键字this给出了调用成员函数的对象的地址。每当调用成员函数时,编译器会向this指针分配调用该函数对象的地址。在例1-4中使用t1.Set(2002,1,28);和t2.Set(2002,11,5);两次调用同一个成员函数Set,对于数据成员month、day、year分属于t1或t2的确认,就是通过this指针完成的。当对某一对象操作时就有一个隐含的this指针指向该对象,所以说在进行t1.Set(2002,1,28);的Set函数中,隐含的t1对象的this指针起到了this->month=m;this->day=d;this->year=y;this->play();的作用。

【例1-5】this指针的作用和工作方式演示。#include<iostream.h>

classTest

{public:

voidSet(int);

voidShow(); //成员函数

private:

intx;

};

voidTest::Set(inta){x=a;}运行结果:

x=12 this->x=12 (*this).x=12

//三种表现形式完全等价,输出结果一样

x=24 this->x=24 (*this).x=24

从输出的两行数据可知,加与不加this,结果都一样,它通过隐含的this指针来区分不同对象的数据成员。

this指针也可以使被屏蔽的对象重现。对于类成员函数中出现的变量(对象)名,编译器的查找过程是:首先在该成员函数中寻找匹配,接着在类成员中寻找匹配,然后考虑在该成员函数定义之前的名字空间域中寻找匹配。运行结果:

x=6

由于在Test函数中定义了局部变量x,因此执行x=8时编译器首先匹配到了局部变量x,于是x=8就作用到了局部变量x。若要使其作用到类数据成员x,就要用this->x。要注意this指针不是一个常规的变量,不能取得this的地址或者给它赋值。1.7.1作用域

类的作用域是指类定义和相应的成员函数定义的作用范围。在该范围内,一个类中的成员之间可以相互访问。在类的成员函数之外对类的数据进行访问是有限制的。

1.在成员函数内部

在成员函数内部,对该类的数据成员或成员函数的访问没有什么限制与不同。1.7作用域、可见性及命名规则

2.在成员函数外部

在类的成员函数之外对类的数据成员进行访问是有限制的。对于private或protected的数据成员,只能通过成员函数进行访问。对于public的数据成员,可以用Jonas.x进行直接访问。按上面的类和成员函数的定义,可以添加main函数如下:voidmain()

{Student Jonas; //定义Student类的对象Jonas

Jonas.x=6; //公有成员可以进行直接访问

Jonas.StudyA(5);

//私有成员只能通过成员函数进行有限访问

}1.7.2可见性

类的作用域确定了变量名或者函数名等标识符的可见性,当标识符在作用域内可见时,就可以使用该标识符。但是当成员名与程序中的其他变量名或者函数名同名时,就要用下面的方法进行访问。

1.同名的局部变量的可见性

如果在成员函数中定义了同名的局部变量,则将原变量屏蔽,即不可访问原变量。在本例中,Student类的成员函数Study可以访问Student类的私有数据成员num,但是在Study中又定义了同名的局部变量num,此时将原变量num屏蔽而使其不可访问,即使加上域区分符也不行,因为num不是全局数据,所以::num=123非法。正确的方法是:Student::num=123或this->num=123。

2.类名可见性

如果一个非类名隐藏了类名,则类名通过加前缀class即可见。

voidfun()

{intStudent; //定义一个变量Student,是变量名而非类名

classStudentstu;//定义一个对象stu,非类名隐藏了类名

Student=8; //对变量赋值

}在本例中,在fun函数之前已经定义了Student类,而在fun内又将Student定义为变量名。这在语法上是成立的,其实际效果是这个变量名隐藏了类名,使类名不可见。要使类名可见,就要加前缀class。

3.非类名可见性

如果一个类名隐藏了一个非类名,则用一般作用域规则即可。

intStudent;

//全局变量

voidfun()

{

classStudent //定义一个局部类

{inta;};

Studentstu; //定义一个对象stu

::Student=8;

//对全局变量赋值,要加前缀域区分符

}在本例中,类名Student隐藏了全局变量名Student,对变量的访问要加域区分符。这个Student类属于函数中定义的局部类,它的成员函数必须在类定义内部定义。在面向对象的程序设计中,这种情况很少出现。1.7.3命名规则

C++中要求一个名字必须有唯一的作用域,因此就存在有关命名的规则。这些规则包括:

(1)一个名字不能同时指定为两种类型。如:

  classStudent

{…};

typedefintStudent;

//error,把Student同时定义为类类型和整型

因为typedef并没有创建新的类型,所以Student同时被指定为两种类型。

(2)类名不能重名。

(3)非类名(常量名、变量名、函数名、对象名和枚举成员名)不能同名。如:

Studentstu;

voidstu()

//error,函数名同对象名

{…}1.8C++程序结构1.8.1类库的构成

一个商业性C++类库包括类定义和成员函数定义。类定义以头文件的方式提供,成员函数则以代码的方式提供。该方式以一定的计算机硬件或操作系统为背景编译实现。

在设计类时要考虑到封装,往往把数据成员作为私有或保护的,而将成员函数作为公有的。需要多少数据成员,主要由参加运算的数据量来决定。

面向对象应用程序设计方法常常能够减少函数调用所需传递的参数个数。这一优点得益于这样一个事实:既将数据成员和成员函数封装在类的内部,又赋予了成员函数访问数据成员的权利。1.8.2程序开发

C++的程序设计方法是:首先要设计类,对于想要实现的各功能,可添加成员函数并在函数体内完成功能的设计;然后再定义对象,通过对象来调用成员函数,使该对象表现出所需行为。

【例1-7】演示一个完整的程序开发过程。

【例1-8】建立一个计算类,用面向对象程序设计的观点实现三项要求:已知月球上的物体重量是地球上的1/17,编写程序计算在地球上重量数为1~100(间隔为10)的物体在月球上的对应重量数;编写程序求出1到X之间的所有素数;显示计算结果。方法二:添加可选择操作菜单。若选择1就计算1~100之间地球与月球上的物体重量数对应关系;若选择2就求出1~100之间的素数;若选择3就输出结果。

//cou.h类头文件名,类的外部接口

#ifndefCOU_H

#defineCOU_H

classCount

{private://cou.cpp类的内部实现

#include"cou.h"

#include<iostream.h>

boolCount::Begin()

{charch;

cout<<"1.countweight\n";

cout<<"2.countdata\n";

cout<<"3.countshow\n";

cout<<"Chooseone(qtoquit):";

cin>>ch;

if(ch<'1'||ch>'3'&&ch!='q') //选择q就退出通过以上两例可以看出,面向对象程序设计包含类库开发和应用程序设计两个环节,其中的大量工作就是类库开发,应用程序设计要尽量简单明了。在定义类时,要将所需的属性(数据成员)和行为(成员函数)加入其中。在应用程序设计时,就由类来定义对象并让对象表现自己(调用成员函数)。例1-8中的程序片段可以用图1-5表示。

图1-5中将程序分成三个模块。用户代码放在第三个文件user.cpp中。在cou.cpp和user.cpp中的代码共享由cou.h提供的界面信息,除此之外这两个文件就是互不相关的,可以分别编译。分别编译在实际开发应用程序中是相当重要的,它可以帮助我们更好地实现模块化。图1-5程序结构● C++是C的超集,C中可用的语法规则在C++中都可用。

● 在面向对象程序设计中,程序被描述为:对象=(算法+数据结构),程序=(对象+对象+…)。

● C++是一种流行的面向对象的程序设计语言。它通过类机制,最有效地实现了面向对象的原理。它使得我们能从真实生活的角度来理解、开发应用程序。

● 类是对现实世界中的实体进行抽象的结果。类是一个抽象的概念,是一个抽象的数据类型。本章要点● 定义类由关键字class开始,后加类名和用“{”及“}”括住的类定义体,最后加“;”。

● 类名要符合标识符的命名规定。建议其第一个字母要大写,以区分类名和对象名。

● 对象是一个客观的实体,是类的一个实例。

● 对象的特性:对象是类的一个实例,它具有成员函数和数据成员。其中成员函数表现了对象的行为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论