480 likes | 719 Views
面向对象程序设计. 山东师范大学信息科学与工程 刘弘. 第一章 C++ 语言概述. 1.1 面向对象程序设计基本概念 1.2 C++ 语言是一种面向对象的程序设计语言 1.3 C++ 程序结构的特点 1.4 Visual C++ 6.0 简介. 1.1 面向对象程序设计基本概念. C++ 发展史
E N D
面向对象程序设计 山东师范大学信息科学与工程 刘弘
第一章 C++语言概述 1.1 面向对象程序设计基本概念 1.2 C++ 语言是一种面向对象的程序设计语言 1.3 C++程序结构的特点 1.4 Visual C++ 6.0简介
1.1面向对象程序设计基本概念 • C++发展史 C++语言是对C语言的扩展,是C语言的超集。C语言是美国贝尔实验室在1969~1973年开发的,与此同时,还用它开发了UNIX操作系统。C语言又是由B语言衍生而来的,B语言是贝尔实验室的Ken Thompson在BCPL语言的基础上开发的,并用它编写了第一个UNIX操作系统。BCPL语言是英国剑桥大学的Martin Richards,60年代在美国MIT时设计的。
C++发展史 1971年,贝尔实验室的Dennis Ritchie扩展了B语言(通过增加类型),他称之为NB,即New B。在更改了B语言的结构,并重写了B语言的编译器后,Ritchie称他的新语言为C。1983年,出现了许多C语言的版本,美国国家标准化协会(ANSI)在1989年出版了标准的C语言,称之为ANSI C。 贝尔实验室的Bjarne Stroustrup在C语言的基础上,创建了C++语言,它是为UNIX系统环境设计的。C++语言增强了C语言的能力,使得程序员能够改进编写程序的质量,并易于程序代码的复用。C++语言的ISO标准已在1997年11月被一致通过,1998年8月被正式批准。
传统的程序设计语言 • FORTRAN • ALGOL • SIMULA 67 • ADA • SMALLTALK
20世纪60年代开发的Simula 67,它是面向对象语言的鼻祖。它将Algol 60中的块结构向前推进了一大步,提出了对象的概念。 • 20世纪70年代出现的Ada语言是支持数据抽象类型的最重要的语言之一。但是,Ada语言不是全面的支持继承,因此人们常称它为一种基于对象的语言。
Smalltalk语言是最有影响的面向对象的语言之一。它丰富了面向对象的概念。该语言并入了Simula语言的许多面向对象的特征,包括类和继承等。在该语言中,信息的隐藏更加严格,每种实体都是对象。Smalltalk语言是最有影响的面向对象的语言之一。它丰富了面向对象的概念。该语言并入了Simula语言的许多面向对象的特征,包括类和继承等。在该语言中,信息的隐藏更加严格,每种实体都是对象。
面向对象程序设计的发展 面向对象程序设计的概念提出后,某些公司和机构曾经开发出一些纯面向对象的语言,比如第一个成功的、纯面向对象的程序设计语言的Smalltalk,但是由于广大的程序员不能一下子完全接受面向对象程序设计的思想,不能完全适应面向对象程序设计的技术,这些语言都没有能够广泛的流行起来。事实上,程序员们长期采用结构化的程序设计方法,并从中汲取了许多宝贵经验,形成了巨大的财富,这些财富应该得到继承和发展;而且结构化程序设计方法在小型软件项目的开发设计上仍然很适用,完全否定这种设计方法也是不恰当的。
C++作为一门混合型语言,在增加对于面向对象方法的支持的同时,还继承了传统程序设计语言C的优点,克服了其不足之处,使得自身既适用于结构化程序设计,又能满足面向对象程序设计的要求,这就符合广大程序员逐步更新其程序设计观念和方法的要求,因而很快流行起来。总之,对于传统的财富不是完全抛弃,而是继承并发展之,是C++语言成功的重要原因。C++作为一门混合型语言,在增加对于面向对象方法的支持的同时,还继承了传统程序设计语言C的优点,克服了其不足之处,使得自身既适用于结构化程序设计,又能满足面向对象程序设计的要求,这就符合广大程序员逐步更新其程序设计观念和方法的要求,因而很快流行起来。总之,对于传统的财富不是完全抛弃,而是继承并发展之,是C++语言成功的重要原因。
面向对象的程序设计程序设计 面向对象的程序设计是一种重要的程序设计方法,它能够有效地改进结构化程序设计中存在的问题。面向对象的程序与结构化的程序不同,由C++编写的结构化的程序是由一个个的函数组成的,而由C++编写的面向对象的程序是由一个个的对象组成的,对象之间通过消息而相互作用。
在结构化的程序设计中,我们要解决某一个问题,就是要确定这个问题能够分解为哪些函数,数据能够分解为哪些基本的类型,如int、double等。也就是说,思考方式是面向机器结构的,不是面向问题的结构,需要在问题结构和机器结构之间建立联系。面向对象的程序设计方法的思考方式是面向问题的结构,它认为现实世界是由对象组成的。面向对象的程序设计方法解决某个问题,要确定这个问题是由哪些对象组成的。在结构化的程序设计中,我们要解决某一个问题,就是要确定这个问题能够分解为哪些函数,数据能够分解为哪些基本的类型,如int、double等。也就是说,思考方式是面向机器结构的,不是面向问题的结构,需要在问题结构和机器结构之间建立联系。面向对象的程序设计方法的思考方式是面向问题的结构,它认为现实世界是由对象组成的。面向对象的程序设计方法解决某个问题,要确定这个问题是由哪些对象组成的。
什么是对象 从概念上讲,对象是代表着正在创建的系统中的一个实体。例如,一个商品销售系统,像顾客,商品,柜台,厂家等都是对象,这些对象对于实现系统的完整功能都是必要的。
从计算机的观点看,一个对象应该包括两个因素:一是数据,相当于班级中的学生;二是需要进行的操作,相当于学生进行的活动。对象就是一个包含数据以及与这些数据有关的操作的集合。如图所示,一个对象是由数据和操作代码组成的。从计算机的观点看,一个对象应该包括两个因素:一是数据,相当于班级中的学生;二是需要进行的操作,相当于学生进行的活动。对象就是一个包含数据以及与这些数据有关的操作的集合。如图所示,一个对象是由数据和操作代码组成的。
对象实现了信息隐藏,对象与外部是通过操作接口联系的,方法的具体实现外部是不可见的。封装的目的就是阻止非法的访问,操作接口提供了这个对象的功能。对象实现了信息隐藏,对象与外部是通过操作接口联系的,方法的具体实现外部是不可见的。封装的目的就是阻止非法的访问,操作接口提供了这个对象的功能。 对象是通过消息与另一个对象传递信息的,每当一个操作被调用,就有一条消息被发送到这个对象上,消息带来了将被执行的这个操作的详细内容。一般地讲,消息传递的语法随系统不同而不同,其他组成部分包括:目标对象,所请求的方法和参数。
每一个实体都是对象。有一些对象是具有相同结构和特性的。例如三年级一班、二班、三班是三个不同的对象,但是它们属于同一类型,它们具有完全相同的结构和特性。每个对象都属于一个类型。在包括C++在内的许多面向对象程序设计语言当中,对象的类型叫做类(class)。类代表了某一批对象的共性和特征。可以说,类是对象的抽象,而对象是类的具体实例。正如同整数类型和一个整型变量的关系一样。我们可以先声明"首都"这样一个类,那么北京、东京、华盛顿都是属于这个类的对象。类是用来定义对象的一种抽象数据类型,或者说它是产生对象的模板。每一个实体都是对象。有一些对象是具有相同结构和特性的。例如三年级一班、二班、三班是三个不同的对象,但是它们属于同一类型,它们具有完全相同的结构和特性。每个对象都属于一个类型。在包括C++在内的许多面向对象程序设计语言当中,对象的类型叫做类(class)。类代表了某一批对象的共性和特征。可以说,类是对象的抽象,而对象是类的具体实例。正如同整数类型和一个整型变量的关系一样。我们可以先声明"首都"这样一个类,那么北京、东京、华盛顿都是属于这个类的对象。类是用来定义对象的一种抽象数据类型,或者说它是产生对象的模板。
每个对象都保存着一些信息,这些信息包括对象的当前的外观,以及它当前的工作方式。这些信息被称为对象的“状态”。每个对象都保存着一些信息,这些信息包括对象的当前的外观,以及它当前的工作方式。这些信息被称为对象的“状态”。 对象之间的相互作用和通信是通过消息。当对象A要执行对象B的方法时,对象A发送一个消息到对象B。接受对象需要有足够的信息,以便知道要它作什么。消息由三个部分组成: (1)受消息的对象(例如,MyBicycle); (2)要执行的函数的名字(例如,changeSpeed); (3)函数需要的参数(例如,HigherSpeed)。
从实现形式上讲,对象是一个状态和操作(方法)的封装体。状态是由对象的数据结构的内容和值定义的,方法是一系列实现步骤。从实现形式上讲,对象是一个状态和操作(方法)的封装体。状态是由对象的数据结构的内容和值定义的,方法是一系列实现步骤。 面向对象的程序设计有三个的主要特征,它们是:封装、继承和多态 。 (一)、封装 封装实现了信息隐藏。对象与外部是通过接口联系,方法的具体实现外部是不可见的。 封装是一个有用的机制: (1)可以防止非法的访问; (2)可使信息局部化。
类 • 现实世界中,常常有许多相同类型的对象。例如,张三的自行车只是世界中许多自行车中的一个。我们说,张三的自行车只是自行车对象类中的一个实例。自行车对象都有相同的数据和对数据的操作,但是,每一个自行车的数据又是独立的。根据这个事实,制造商建造自行车时,用相同的模板建造许多自行车。在面向对象的程序设计中,我们把这个模板称之为类。也就是说,类是定义某种对象共同的数据和操作的模板或原型。
(二)、继承 一般说来,对象是根据类来定义的。我们也可以用一个类来定义另一个类。例如,山地车、赛车和双座自行车都是自行车的一种。用面向对象的术语来说,它都是自行车类的子类或派生类,而自行车类是它们的超类或父类或基类。 每一个子类继承了超类的数据和操作,但是,子类并不是局限于超类的数据和操作。例如,双座自行车有两个坐垫,山地车有一个额外的低速齿轮。继承的主要益处是可以复用超类的程序代码。
(三)、多态 多态是指对于相同的消息,不同的对象具有不同的反应的能力。多态在自然语言中应用很多,我们以动词"关"为例。同一个"关"子应用于不同的对象,含义就不相同。例如,关一个门,关一个银行帐户或关一个窗口,精确的含义依赖于执行这种行为的对象。在面向对象的程序设计中,多态意味着不同的对象,对同一消息具有不同的解释。多态是一个强大的功能,它允许调用对象的成员函数,而不用关心对象的类型。
1.2 C++ 语言是一种面向对象的程序设计语言 C++语言是一种应用较广的面向对象的程序设计语言,使用它可以实现面向对象的程序设计。面向对象的设计与面向过程的设计是有很大区别的,面向对象的程序设计是在面向过程的程序设计的基础上一个质的飞跃。要学会面向对象的程序设计,首先要学会一种面向对象的语言,即要学会用VC编程,就要先有C++的基础,而学习C++语言首先要认识它面向对象的特性和实现面向对象的方法。
C++对面向对象程序设计方法的支持 1、C++支持数据封装支持数据封装就是支持数据抽象。在C++中,类是支持数据封装的工具,对象则是数据封装的实现。面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数关系上是不同的,在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义,数据将被隐藏在封装体中,该封装体通过操作接口与外界交换信息。对象被说明具有一个给定类的变量,类类似于C语言中的结构,在C语言中可以定义结构,但这种结构中包含数据,而不包含函数。C++中的类是数据和函数的封装体。在C++中,结构可作为一种特殊的类,它虽然可以包含函数,但是它没有私有或保护的成员。
2、C++类中包含私有、公有和保护成员 C++类中可定义三种不同访控制权限的成员。一种是私有(Private)成员,只有在类中说明的函数才能访问该类的私有成员,而在该类外的函数不可以访问私有成员;另一种是公有(Public)成员,类外面也可访问公有成员,成为该类的接口;还有一种是保护(Protected)成员,这种成员只有该类的派生类可以访问,其余的在这个类外不能访问。
3、C++中通过发关消息来处理对象 C++中是通过向对象发关消息来处理对象的,每个对象根据所接收到的消息的性质来决定需要采取的行动,以响应这个消息。响应这些消息是一系列的方法,方法是在类定义中使用函数来定义的,使用一种类似于函数调用的机制把消息发送到一个对象上。
4、C++中允许友元破坏封装性 类中的私有成员一般是不允许该类外面的任何函数访问的,但是友元便可打破这条禁令,它可以访问该类的私有成员(包含数据成员和成员函数)。友元可以是在类外定义的函数,也可以是在类外定义的整个类,前者称友元函数,后者称为友元类。友元打破了类的封装性,它是C++另一个面向对象的重要性。
5、C++允许函数名和运算符重载 C++支持多态性,C++允许一个相同的标识符或运算符代表多个不同实现的函数,这就称标识符或运算符的重载,用户可以根据需要定义标识符重载或运算符重载。
6、C++支持继承性 C++中可以允许单继承和多继承。一个类可以根据需要生成派生类。派生类继承了基类的所有方法,另外派生类自身还可以定义所需要的不包含在父类中的新方法。一个子类的每个对象包含有从父类那里继承来的数据成员以及自己所特有的数据成员。
7、C++支持动态联编 C++中可以定义虚函数,通过定义虚函数来支持动态联编。
C++与C语言的关系 1. C++保持与C语言的兼容 2. C++对C语言作了很多改进 3. C++与C语言的本质区别
C++对C语言的改进 • C++在增加面向对象的特征之外,还对C语言进行了扩充和增强。主要的增强点有如下几个:1.注释。 在C语言块注释的形式/*Explanation Sentence*/ 的基础上,C++语言提供了一种新的单行注释形式://Explanation Sentence 即用"//"表示注释开始,从该位置直到当前行结束的所有字符都被作为注释。
2.更加灵活的变量说明 在传统的C语言中,局部变量的说明必须集中放在执行代码的前面,数据说明语句和执行语句的混合将引起编译错误。而在C++中,可以在程序代码块的任何地方进行局部变量的说明。比如下面的代码在C语言中是不正确的,在C++语言中却可以正常运行。for(int i = 1; i < = 100; i++); 这样做的好处是使变量的定义和它的使用集中在一起,意义一目了然。
3. 更加严格的函数原型说明 C++摒弃了C语言对函数原型随意简化的方式,这种简化是许多C语言程序错误的根源。C++语言要求编程者为函数提供完整的原型,包括全部参数的类型和返回值得说明。 例如,有字符型和双精度类型两个参数、返回整型值的函数f,原型应该写为:int f(char, double); 而C语言中允许将这个原型写成"f( );"。
4.增加了函数重载机制 • 重载是程序语言领域的重要概念。常规语言中最典型的例子是"+、-、×、/"等各种算术运算符的重载,这些符号可以同时用来表示多种类型数据之间的运算,这种对一个名字或一个符号赋予多重意义的情况就叫重载。C++语言增加了C语言所没有的函数重载机制。对一个函数名可以给出多个函数定义,只要这些定义可以通过参数个数或类型的不同区别开来即可。C++还允许对系统中预先定义的运算符号进行重载,增加新的定义。这样做的优点是在今后对新定义类型的变量进行运算时,计算公式写起来方便自然。
5.更加方便的动态存储分配 C++为了提高内存管理上的灵活性,提供了动态内存分配合释放的操作符new和delete,用来增强C语言中原有的函数malloc()和free();
6.输入/输出流机制 C++保留了C语言标准库中各种输入/输出函数,而且提供了一套新的输入/输出机制――流机制。 比如向标准输出输出一个字符串:cout<<"C++ is beautiful!"; 或者由标准输入读一个整数,赋给变量aint a;cin>>a; 流式输入/输出运算符能够根据变量类型自动确定数据交换过程中的转换方式,还可以定义"<<、>>"的重载,方便了编程者自定义类型的数据的输入/输出。
C++的词法及词法规则 1、C++的字符集字符是一些可以区分的最小符号。C++的字符集由大小写英文字母(a-z和A-Z)、数据字符(0-9)、特殊字符(空格,!,#,%,^,&,*,_,<,>,?,\,,)组成。
2、单词及词法规则 • 单词又称词法记号,它是由若干个字符组成的具有一定意义的最小词法单元。C++共有6种单词,分别是:标识符、关键字、运算符、分隔符、常量、注释符,在编码时要特别注意这些单词的词法规则。 • 注意C++对大小写敏感。
#include <iostream.h> void main() { double x,y; cout<<"Enter two float numbers:"; cin>>x>>y; double z=x+y; cout<<"x+y="<<z<<endl; }
C++程序结构的组成 • C++程序结构的基本组成部分1预处理命令,C++提供了三类预处理命令:宏定义命令、文件包含命令、条件编译命令。#include <iostream.h>2输入输出,C++程序中总是少不了输入和输出的语句,实现与程序内部的信息交流。特别是屏幕输出的功能,几乎每个程序都要用到,使用它把计算机的结果显示在屏幕上。 cout<<“Enter two float numbers:” cin>>x>>y; cout<<“x+y=“<<z<<endl;
3函数,C++的程序是由若干个文件组成的,每个文件又是由若干个函数组成,因此,可以认为C++的程序就是函数串,即由若干个函数组成,函数与函数之间是相对的,并且是并行的,函数之间可以调用。在组成一个程序的若干个函数中,必须有一个main()。4语句,语句是组成程序的基本单元。函数是由若干条语句组成的。但是,空函数是没有语句的。语句是由单词组成,单词间用空格符分隔,C++程序中的语句又是以分号结束。语句除了有表达式语句和空语句之外,还有复合语句、分支语句、循环语句和转向语句等若干类。
5变量,多数程序都需要说明和使用变量。广义讲,对象包含了变量,即将变量也称为一种对象,狭义讲,将对象看作是类的实例,对象是指某个类的对象。5变量,多数程序都需要说明和使用变量。广义讲,对象包含了变量,即将变量也称为一种对象,狭义讲,将对象看作是类的实例,对象是指某个类的对象。 6其他,除了以上讲述的5个部分以外,还有其他组成部分。例如,符号常量和注释信息也是程序的一部分。C++中都尽量把常量定义为符号常量,在C++的程序中出现的是符号常量,该符号常量代表着某个确定的常量值。 #define PI 3.14159
C++程序的书写格式 在编程时应该注意C++的书写格式,基本原则是:一行一般写一条语句。短语句可以一行写多个。长语句可以一条写多行。分行原则是不能将一个单词分开。用双引号引用的一个字符串也最好不分开,如果一定要分开,有的编译系统要求在行尾加续行符(“\”)
C++程序的实现 C++源程序的实现与其他高级语言源程序实现的原理是一样的。一般都要经过编辑、编译、运行。其中最要的是编译过程,C++是以编译方式实现的高级语言。C++程序的实现,必须要使用某种C++语言的编译器对程序进行编译。编译器的功能是将程序的源代码转换成为机器代码的形式,称为目标代码;然后,再使目标代码进行连接,生成可执行文件。该过程可分为三个子过程:预处理过程、编译过程(词法分析、语法分析、符号表、错误处理程序、生成目标代码)、连接过程。
C++语言程序的编写和运行 Visual C++6是美国微软公司开发的C++集成开发环境,它集源程序的编写、编译、连接、调试、运行,以及应用程序的文件管理于一体,是当前PC机上最流行的C++程序开发环境。。
编写和运行过程 使用文本编辑工具编写C++程序,其文件后缀为.cpp,这种形式的程序称为源代码(Source Code),然后用编译器将源代码转换成二进制形式,文件后缀为.obj,这种形式的程序称为目标代码(Objective Code),最后,将若干目标代码和现有的二进制代码库经过连接器连接,产生可执行代码(Executable Code),文件后缀为.exe,只有.exe文件才能运行。
单文件程序 • 启动Visual C++ 6.0, 选择File->New->File->C++ Source File • 出现编辑框后,键入C++源程序。 • 编译,Build->Compile ****.cpp • 运行, Build->Execute ***.exe(或者用快捷键Ctrl-F5,或者是单击工具栏中的红色!图标)
多文件程序 • 多文件程序是指该程序至少包含两个文件。 1.用文本编辑软件建好C++源文件,并命名为*.cpp. 2. 创建一个新的工程文件。 File->New->Project->Win32 Console Application 3.向工程中添加文件 Project->Add File to Project->Insert File into Project 4.编译,Build->Build All 5.运行同单文件。
#include <iostream.h> int add(int,int); void main() { int a,b; a=5; b=7; int c=add(a,b); cout<<"a+b="<<c<<endl; } int add(int x,int y) { return x+y; }