课本:《面向对象程序设计及C++》(第三版)主编: 朱立华、俞琼、郭剑 人民邮电出版社
免费在线电子书
学习目标:
●了解面向对象程序设计方法
●理解主要概念:类、对象、封装、继承、多态
●了解C++语言特性
●熟悉VS2010集成开发环境
C语言仅支持面向过程设计;
C++语言是C语言的超集,是对C语言的兼容、改进及扩充,既支持面向过程的程序设计,又支持面向对象的程序设计,但后者是其主要特色和应用。
在4.3中进行了较为详细的论述
关于C语言的学习,可见于鄙人CSDN专栏 大一C语言挣扎之路
在面向对象程序设计方法出现之前,在软件开发过程中,人们广泛使用的是面向过程的程序设计方法。
面向过程的程序设计具有结构清晰、模块化强的特点。但是,面向过程的程序设计方法以功能为核心,将数据和对数据的操作分离,功能要求一旦发生改变,就可能需要重新定义数据结构,从而需要重新编写很多代码。因为一旦数据结构发生改变,与之相关的所有操作都需要改变,实现这些操作的函数代码也就随之而变。有的时候,即使功能类似,但由于用于不同的数据结构之上,代码也需要重新编写而无法复用。因此,面向过程的程序设计存在代码可重用性和可维护性差的缺点,不适用于大型程序的开发和维护。
面向过程的程序设计范型是“程序=算法+数据结构”,数据与对数据操作的分离导致软件维护(包括软件的测试、调试和升级)困难。随着软件业的繁荣,面向对象的程序设计方法应运而生,它很好地解决了以上问题。
面向对象程序设计(Object-Oriented Programming,OOP)是目前主流的程序设计方法之一。
传统的对象是类的实例,在类中封装了数据与对数据的操作(也称作方法),通过向对象发送消息(Message),进而由对象启动相关的操作(方法)完成各种功能。以提高软件的重用性、灵活性和扩展性,在大型项目设计中广为应用。
比如定义一个Person类来表示人类,
需要说明该类的特征以表述这个Person类与其他类的不同。我们先来尝试找出人类拥有的共同特性:姓名、性别、年龄、生日、专业、爱好,等等。
你会发现,身边的每个人都有这些属性。那么我们就可以把这些属性用相应的变量来描述:name、sex、age、birthday、specialty、hobby,等等。
在面向对象程序设计中,属性就是要表述的数据,在类中称为数据成员(Data Member),表示这一类对象共同拥有的静态特性。
人类有哪些对于这些数据的操作呢?比如,王小明长大了一岁,年龄需要修改,随着年龄的增长,爱好发生改变了,学习了新的技能,利用自己的专长找到一份自己喜爱的工作,等等。对应就有了modify_Age()、modify_Hobby()、study()、job_Hunting()等函数来实现这些操作。这些对数据的操作称为成员函数(Member Function),表示这一类对象共同拥有的动态特性。
面向对象程序设计中最突出的特征是封装性、继承性和多态性(有的地方有第四特征抽象),最重要的概念是类和对象,面向对象的程序设计就是围绕类的定义和类的使用展开的。
一个类的所有数据成员以及成员函数是一个被封装的整体,类与对象的关系
①从使用的角度看:类则是对具有相同属性和操作的一组对象的抽象,为属于该类的全部对象提供了统一的抽象描述;对象是类的一个具体的个体,也称为类的一个实例。
例如,学生是一个类,jinhao、niemanyu则是学生类的两个对象。
②类实质上就是一种类型,这种类型与一般类型不同:类包括数据成员和成员函数。
对象实际上属于类类型的一个变量,这种变量与一般变量不同:对象由一组具体的属性(即数据成员)的值来标识,可以执行类所定义的行为。(即成员函数)
数据成员是描述对象的静态特性的数据项,成员函数是描述对象动态特性的操作。
③对象就是一个数据和操作的封装体
④换言之,对象就是一个属性和行为的封装体
综上,对象必须属于某一个类,必须有一个区别于同类型其他对象的对象名。
可以有自己的的属性值,即每个对象的数据成员由特定的值来标识该对象的静态特性。
可以有一组由类规定的操作,每一个操作决定对象的一种动态行为,通过“对象名.成员函数名(实际参数表)”的形式实施这种行为,同类对象的行为是一致的。
封装在生活中无处不在。例如,我们日常使用的智能手机,作为用户,我们无需知道手机内部的构造和主板上芯片的功能,手机壳完美地封装了手机,也提供给用户合理的操作接口来使用手机:通过触摸屏完成各项用户需求;摄像头捕获各种影像;充电接口完成动力输入;调音开关设置适宜的音量;话筒输入语音信息,等等。这些接口是手机对象与用户交互的媒介,用户只要知道这些接口的功能并且会使用就可以了,至于手机里面有哪些元器件,用户的操作会导致内部的元器件状态如何改变,这些元器件是如何参与工作等细节对用户是隐藏的,手机壳将这些都封装在里面。这样的封装可以保证智能手机方便使用、元器件受到保护,且对部分核心制造技术还可以保密。
封装主要是针对对象而言的,对象就是一个数据和操作的封装体,但也不是全封闭的,对象中的成员设计了访问属性的限定:private(私有属性)、protected(保护属性)、public(公有属性)。对象的private或protected成员被封装和信息隐藏,而对象的public属性成员呈现为对外接口,但具体实现细节(即成员函数的实现代码)都对外隐藏。
封装性使得面向对象程序设计具有面向过程程序设计无法比拟的安全性和可靠性。
继承是面向对象的程序设计提高代码重用性的重要措施。
继承使一个类(称为基类或父类)的数据成员和成员函数能被另一个类(称为派生类或子类)重用。
在派生类中,只需增加一些基类中没有的数据成员和成员函数,或是对基类的某些成员进行改造,就可以避免公共代码的重复编写,减少代码和数据冗余。
多态性是面向对象程序设计的一个重要特征,是指一种行为对应多种不同的实现方法。即是发出同样一条指令,由于接受指令的主体不同,会做出不同的反应。
多态性有静态多态性(也称为编译时的多态性)和动态多态性(也称运行时的多态性)两种。静态多态性通过函数重载和运算符重载来实现,动态多态性需要继承、虚函数、基类的指针或引用来实现。
因此,多态性的意义在于用同一个接口实现不同的操作,这样,直接使用类来进行程序开发就很方便。
C++ 语言的研发始于1980年,贝尔实验室的Bjarne Stroustrup对C语言进行改进和扩充,增加了对面向对象程序设计的支持。最初的成果称为“带类的C”,1983年正式取名为C++,在经历了3次修订后,于1994年制定了ANSI C++标准的草案,以后又经过不断完善,成为目前的C++语言,并仍在不断地发展。C++语言是同时支持面向过程程序设计和面向对象程序设计的混合型语言,是目前应用广泛的高级程序设计语言之一。
C++语言是支持面向对象的程序设计,具体表现在以下3个方面。
1.支持封装性
C++语言允许使用类和对象。类是支持封装的工具,对象是封装的实体,是封装的具体实现。
2.支持继承性
C++语言同时支持单一继承和多重继承。
3.支持多态性
C++语言同时支持静态多态性和动态多态性,主要表现在以下两个方面:通过静态联编实现的静态多态性和通过动态联编实现的动态多态性。
C++语言由C语言发展而来,兼容C语言,并对C语言做了改进和扩充。它们之间的关系可以用继承和改进来概括。
C语言是C++语言的一个子集。C语言的词法、语法等绝大多数都可以直接用到C++语言中,
例如:
(1)C语言中的类型、运算符和表达式在C++语言中都可以使用;
(2)C语言的语句也是C++语言的语句;C语言中的函数定义及调用在C++语言中也合法;
(3)C语言的预处理命令也可用于C++语言;
(4)C语言中的构造类型,如数组、结构体和联合体类型在C++语言中也可以使用,但是C++语言提供了更简洁灵活的用法;
(5)C语言的指针在C++语言中一样运用,但是C++语言在动态内存空间的管理上引入了更方便的方式,通过增加“引用”大大减少了不安全指针的使用;
(6)C语言中关于作用域的规则、存储类别的规定在C++语言中也都适用。
C++语言虽然保留了C语言的风格和特点,但也针对C语言的某些不足做了改进。下面简单列举C++语言对C语言的一些改进内容,
(1)C++语言提供了与C语言不同的I/O流类库,方便了输入/输出操作。
(2)C++语言引入了名字空间,避免出现同名的问题。
(3)C++语言新增加了专用于处理逻辑值的bool类型,增加了string类型方便字符串的处理。允许定义无名联合、无名枚举类型,并且有新的用法。对结构体类型进行了扩充,结构体中可以有成员函数。
(4)C++语言允许函数的形式参数带有默认值,方便了函数调用。
(5)C++语言引进了函数重载和运算符重载机制,方便了编程。
(6)C++语言引进了“引用”的概念,可以通过变量的别名直接操作变量本身,而不必通过指向变量的指针间接操作变量,这样大大减少了指针的使用,提高了程序的安全性。
(7)C++语言提供了对异常的检查、处理机制,增强了程序的健壮性。
(8)C++语言利用指针使用new和delete运算符代替函数更方便地分配与释放动态内存空间。
面向对象的程序设计语言作为高级语言的一种,研发开始于20世纪60年代,先后出现了Simula、Smalltalk、Object-C、Eiffel、Ada、C++、Java和Python等面向对象的程序设计语言。
20世纪60年代开发的Simula 67语言被誉为面向对象程序设计语言的鼻祖,因为它提出了对象、类、继承的概念和面向对象的术语,面向对象程序设计的许多原始思想都来源于Simula语言。
Smalltalk语言是从20世纪70年代开始开发的,它完整体现了来自Simula以及其他早期原型语言中面向对象的概念,历经了Smalltalk-72、Smalltalk-76和Smalltalk-80几个版本,现在一般用Smalltalk-80。
Object-C语言是1983年左右开发的,它在C语言的基础上进行了扩充,通过新引入的构造和运算符来完成类定义和消息传递,其语法更像Smalltalk语言。
Eiffel语言从理论上讲是较好的面向对象的程序设计语言,它除了封装和继承外,还集成了几个强有力的面向对象的特征,如参数化多态性、对方法实施前置条件和后置断言等。
Ada语言的开发工作始于1975年,最初设计是为了构建长周期的、高度可靠的软件系统。Ada语法严谨、书写优美、可读性强,它提供了一系列功能来定义相关的数据类型(type)、对象(object)和操作(operation)的程序包(package)。Ada有Ada 83和Ada 95两个主要版本,Ada一度被美国国防部强制指定为军用武器系统的唯一开发语言。
Java语言是由SUN公司在20世纪90年代初开发的一种面向对象的程序设计语言,其优点是简单、面向对象、不依赖于硬件结构、可移植性强、安全性高、能最大限度地利用网络,因此被广泛用于网络编程。
Python最初被设计用于编写自动化脚本(Shell),随着版本的不断更新和语言新功能的添加,它越来越多被用于独立的、大型项目的开发。
用C++语言开发程序,必须遵循一定的步骤与方法。有功能强大的IDE的支持,会使C++程序的开发工作变得更轻松。
集成环境中提供了编辑器、编译器、链接器、库等基本部件,使得源程序从编辑到最后的运行均可在集成环境中完成。目前,常用的C++集成环境有Microsoft Visual Studio、C++ Builder、GCC、Visual Studio Code等。
Microsoft Visual Studio 2010的下载和一些简单操作详见大一C语言挣扎之路1(电子计算机概述和Visual Studio )
1.编辑器
编辑器给用户提供了创建和编辑C++源代码的交互式环境。除了常用的编辑功能外,还可以用不同的颜色来体现不同的C++语言元素,自动识别C++语言中的基本词汇,根据其类别分配颜色。这种分色处理提高了代码的可读性,且在输入这些单词出错时,可以提供清楚的指示,所以不建议在平常使用的办公类文本编辑器中编写源代码。
2.编译器
编译器将源代码转换为目标代码,并检测和报告编译过程中的错误。编译器可以检测各种因无效或无法识别的程序代码造成的语法类错误,也可以检测结构性错误,比如部分代码会永远不被执行。编译器输出的目标代码存储在称为目标文件的文件中,该文件的扩展名是.obj。
3.链接器
链接器组合那些由编译器根据源代码文件生成的各种模块,再从作为C++组成部分的程序库中添加所需的代码,并将这些代码整合为可执行的程序,在链接过程中也会检测并报告错误。例如,程序中缺少了组成部分,或者引用了不存在的库等问题。链接成功生成的代码为可执行文件,该文件的扩展名是.exe。
4.库
库是C++中预先编写的例程集合,如计算平方根及计算三角函数这样的数值函数、字符串处理等。通过提供标准代码单元,支持并扩展C++语言。最常见的操作就是将这些代码合并到用户自己的程序中,节省用户编写并测试这些代码所需的时间,提高了效率。