面向对象基础编程实验报告(面向对象编程实验小结)
编程|多视角简单理解面向对象
效率最高,对机器最友好的自然是机器语言程序(按机器指令集直接编写机器可以识别的二进制代码序列)。对机器友好,对人却不是很友好,难写,难读,难维护。就如同象形文字一样,虽然够形象,但不够抽象,不方便表达和交流。
所以,机器语言需要抽象,用一些英文词或字母组合缩写来表示机器指令,做成一个手册来描述机器或CPU,程序员按这些字母组合来写程序,然后替换一下,这样似乎可行,而查找替换正是计算机所擅长的,另写一个这样的查找替换的翻译程序即可,其实这就是汇编语言,翻译程序就是汇编器。
人的欲望是没有止境的,我们希望写程序更快捷,更易读,更易维护,更接近人类语言,那就来更高一层的抽象吧,将一些复用场景较高的代码块规范化为一个英文词,由汇编的一对一的关系转变为一对多的关系,一些操作直接用运算符来代替,流程跳转用goto代替,后来甚至发现,只用三种流程结构(顺序、选择、循环)和 和任意数量的布尔型标志就能表示任何功能或算法,这就是结构化编程语言。结构化编程语言也叫面向过程编程语言,用数据描述问题,对函数描述解决问题的步骤,将关联性较高的数据和函数放到同一文件中,通过文件来区隔接口和模块。
当面对成百上千、成千上万的函数时?是不是有心乱如麻的感觉?一种常用的方法就是分类,自然又会是更高一层的抽象,使用更大一点颗粒,如果组装产品,组件越大,组件的接口越友好,组装更便捷(需要注意的是,有些产品是不适合组装的)。这种更高抽象,更大颗粒的编程思想就是面向对象(OOP, Object Oriented Programming )。
在面向对象编程中,抽象的核心是数据,操作这些数据的成员函数是辅助, 以数据为中心,由 成员 函数提供接口,以消息进行联系。相对而言, 面向过程抽象的核心是处理数据的过程。
面向过程也只是一种抽象方式而已。
面向对象编程的主要思想非常简单:尝试将一个功能强大的程序整体分解为功能同样强大的多个部分。这样就可以将一些数据和那些只在相关数据上使用的函数耦合起来。
注意,这仅涵盖封装的概念。也就是说,位于对象内部的数据和函数对于外部是不可见的。我们只能通过消息(通常通过 getter 和 setter 函数)与对象的内容进行交互。
继承性和多态性并没有包含在最初的设计想法中,但是对于现在的面向对象编程而言是必需的。继承基本上意味着开发者可以定义具有其父类所有属性的子类。直到 1976 年,即面向对象的程序设计的概念问世十年之后,继承性才被引入。
又过了十年,多态性才进入面向对象的编程。简单来讲,这意味着某种方法或对象可以用做其他方法或对象的模板。从某种意义上说,多态性是继承性的泛化,因为并不是原始方法或对象的所有属性都需要传输到新实体。相反,你还可以选择重写一些属性。
多态性的特殊之处在于,即使两个实体在源代码中互相依赖,被调用实体的工作方式也更像插件。这使得开发人员的工作变得轻松,因为他们不必担心运行时的依赖关系。
值得一提的是,继承性和多态性并不是面向对象编程所特有的。真正的区别在于封装数据及其包含的方法。在计算资源比今天稀缺得多的时代,这是一个天才的想法。
结构化编程,面向对象编程、函数式编程)这三个编程范式分别限制了goto语句、函数指针和赋值语句的使用。
结构化编程是对程序控制权的直接转移的限制。
面向对象编程是对程序控制权的间接转移的限制。
函数式编程是对程序中赋值操作的限制。
这三个编程范式都对程序员提出了新的限制。每个范式都约束了某种编写代码的方式,没有一个编程范式是在增加新的能力。
也就是说,我们过去50年学到的东西主要是:什么不应该做。
应当说,面向对象和函数式不冲突。但还是很多人觉得用函数式就等于要丢下面向对象。
但只有小孩子才做选择,单一范式总是存在缺陷的。
最初的时候,代码都很短小精干,几十上百行而已,一行一行的语句写下去就OK了;
随着需求的增加,慢慢地,代码量开始加大,出现了成千上万行的代码。这时候,代码的组织管理就出现了问题。怎么办?引入函数。上万行代码被组织成了百十来个函数,是不是好管理多了?就像上万名士兵,按师团连排组织起来一样。
然而,软件工程的规模进一步扩大,导致一个项目出现了成千上万个函数!这时候怎么办?我们是不是又只能“分门别类”地把这些函数组织起来?于是出现了类,继而出现对象和面向对象……
一开始学习的时候,你不要去管什么“重用”“耦合”、“可扩展”、“封装变化”……等等这些东西,首先理解:不得已!
使用函数,使用类是我们不得已而为之的事情啊!
不能理解“不得已”,是不能理解“面向对象”的关键。
我们很多课程书籍,一介绍面向对象,就开始介绍面向对象的优势,吧啦吧啦,这其实是一个……一个什么呢?不能说这样做错了,但是,会增加入门者理解面向对象的难度。
更进一步,不能理解“不得已”,也会阻碍理解“设计模式”:
理解面向对象,一定要首先理解:面向对象解决的是“代码组织”的问题。不是代码实现。
在 历史 上OOP最辉煌的时刻之一,应该是MFC。
虽然MFC现在看起来十分简陋和难用,但是这套复杂系统从出现到普及,到解决很多实际问题、提供了各种扩展方案。这个庞大而复杂的系统成功解决了windows这种基于GUI的软件的开发,完成了当时的 历史 使命。
OOP的普及和程序界面图形化的大潮是密不可分的,GUI恰恰是OOP最擅长的领域之一。甚至到了今天,在某些纯C语言编写的 游戏 引擎中,一旦到了UI部分,还是要在C语言里使用OO的写法和思路。在设计控件时使用继承真的是再合适不过了。
在 游戏 引擎中,都没有也不可能脱离OOP,或多或少。因为模拟世界中的各种物体,这件事也是OOP所擅长的。但是现在很多人在编写具体逻辑时,确实喜欢避免继承,这和纯粹的OOP思路不太一样。简单来说,引擎提供的组件本身是用到了继承的,但是进一步编写 游戏 逻辑时又要避免深一步的继承。
-End-

C++实验报告,怎么做?
c(c++)上机实验报告格式:
⒈ ?实验目的 ?
(1) 了解在具体的语言环境下如何编辑、编译、连接和运行一个 C 程序。
⑵ 通过运行简单的 C 程序,初步了解 C 源程序的特点。
⑶ 掌握 C 语言数据类型,熟悉如何定义一个整型、字符型和实型的变量,以及对它们赋值的方法。
⑷ 掌握不同的类型数据之间赋值的规律。
⑸ 学会使用 C 的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。
2.实验内容和步骤
⑴ ?检查所用的计算机系统是否已安装了 C 编译系统并确定他所在的子目录。
⑵ 进入所用的集成环境。
⑶ 熟悉集成环境的界面和有关菜单的使用方法。
⑷ 输入并运行一个简单的、正确的程序。
⒊ 实验题目
⑴ 输入下面的程序
# include “stdio.h” void main()
{ printf(“This is a c program.\n”); }
程序无误,其运行的结果为:
面向对象编程方法的要点
面向对象的主线:
Java类及类的成员:属性、方法、构造器(高频);代码块、内部类(低频) (类是由对象派生的)
面向对象的三大特征:封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)、(抽象性)
其它关键字:this、super、static、final、abstract、interface、package、import等
面向过程(ProcedureOrientedProgramming)与面向对象(ObjectOriented Programming)的理解
二者都是一种思想,
面向对象是相对于面向过程而言的。
面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。
面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。而且更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
2.面向对象:强调具备功能得对象,以类/对象为最小单位,考虑谁来做。
1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
2.面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象的思想概述
类(Class)和对象(Object)是面向对象的核心概念。
类是对一类事物的描述,是抽象的、概念上的定义
对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
程序员从面向过程的执行者转化成了面向对象的指挥者
面向对象分析方法分析问题的思路和步骤:
根据问题需要,选择问题所针对的现实世界中的实体。
从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
面向对象的两个要素:类和对象
类 :对一类事物的描述,是抽象的、概念上的定义
对象:是实际存在的该类事物的每个个体(实实在在的个体),因而也称为实例(instance)。
以人为例子: 类 = 抽象概念的人 ; 对象 = 实实在在的某个人
面向对象程序设计的重点是类的设计
设计类,就是设计类的成员。
二者关系:对象是由类派生(new)出来的、对象是类的实例化
类的结构:属性和方法
现实世界的生物体,大到鲸鱼,小到蚂蚁,都是由最基本的细胞构成的。
同理,Java代码世界是由诸多个不同功能的类构成的。
现实生物世界中的细胞又是由什么构成的呢?细胞核、细胞质、…那么,Java中用类class来描述事物也是如此。常见的类的成员有:
属性:对应类中的成员变量
行为:对应类中的成员方法
类和对象的创建和执行操作有那三步(落地实现的规则)?
①创建类,设计类的成员
②类的实例化(创建类的对象)
③通过“对象.属性”或 “对象.方法”调用对象的结构
几个常用的概念
属性= 成员变量 = Field = 域、字段
方法= 成员方法 = Method =函数
创建类的对象 = 类的实例化 = 实例化类
面向对象的实现
(一)程序设计语言
⒈选择面向对象语言
采用面向对象方法开发软件的基本目的和主要优点是通过重用提高软件的生产率。因此,应该优先选用能够最完善、最准确地表达问题域语义的面向对象语言。
在选择编程语言时,应该考虑的其他因素还有:对用户学习面向对象分析、设计和编码技术所能提供的培训操作;在使用这个面向对象语言期间能提供的技术支持;能提供给开发人员使用的开发工具、开发平台,对机器性能和内存的需求,集成已有软件的容易程度。
⒉程序设计风格
⑴提高重用性。
⑵提高可扩充性。
⑶提高健壮性。
(二)类的实现
在开发过程中,类的实现是核心问题。在用面向对象风格所写的系统中,所有的数据都被封装在类的实例中。而整个程序则被封装在一个更高级的类中。在使用既存部件的面向对象系统中,可以只花费少量时间和工作量来实现软件。只要增加类的实例,开发少量的新类和实现各个对象之间互相通信的操作,就能建立需要的软件。
一种方案是先开发一个比较小、比较简单的来,作为开发比较大、比较复杂的类的基础。
⑴“原封不动”重用。
⑵进化性重用。
一个能够完全符合要求特性的类可能并不存在。
⑶“废弃性”开发。
不用任何重用来开发一个新类。
⑷错误处理。
一个类应是自主的,有责任定位和报告错误。
(三)应用系统的实现
应用系统的实现是在所有的类都被实现之后的事。实现一个系统是一个比用过程性方法更简单、更简短的过程。有些实例将在其他类的初始化过程中使用。而其余的则必须用某种主过程显式地加以说明,或者当作系统最高层的类的表示的一部分。
在C++和C中有一个main()函数,可以使用这个过程来说明构成系统主要对象的那些类的实例。
(四)面向对象测试
⑴算法层。
⑵类层。
测试封装在同一个类中的所有方法和属性之间的相互作用。
⑶模板层。
测试一组协同工作的类之间的相互作用。
⑷系统层。
把各个子系统组装成完整的面向对象软件系统,在组装过程中同时进行测试。
面向对象程序?
面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术[1] 发展到一定阶段后的产物。
面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。OOP 主要有以下的概念和组件:
组件 - 数据和功能一起在运行着的计算机程序中形成的单元,组件在 OOP 计算机程序中是模块和结构化的基础。
抽象性 - 程序有能力忽略正在处理中信息的某些方面,即对信息主要方面关注的能力。
封装 - 也叫做信息封装:确保组件不会以不可预期的方式改变其它组件的内部状态;只有在那些提供了内部状态改变方法的组件中,才可以访问其内部状态。每类组件都提供了一个与其它组件联系的接口,并规定了其它组件进行调用的方法。
多态性 - 组件的引用和类集会涉及到其它许多不同类型的组件,而且引用组件所产生的结果得依据实际调用的类型。
继承性 - 允许在现存的组件基础上创建子类组件,这统一并增强了多态性和封装性。典型地来说就是用类来对组件进行分组,而且还可以定义新类为现存的类的扩展,这样就可以将类组织成树形或网状结构,这体现了动作的通用性。
由于抽象性、封装性、重用性以及便于使用等方面的原因,以组件为基础的编程在脚本语言中已经变得特别流行。典型的OOP程序设计语言有C++、JAVA(C语言属于纯粹的面向过程的编程语言,以函数为主),Python 和 Ruby 是最近才出现的语言,在开发时完全采用了 OOP 的思想,而流行的 Perl 脚本语言从版本5开始也慢慢地加入了新的面向对象的功能组件。用组件代替“现实”上的实体成为 JavaScript(ECMAScript) 得以流行的原因,有论证表明对组件进行适当的组合就可以在英特网上代替 HTML 和 XML 的文档对象模型(DOM)。
什么是面向对象编程?
在我理解,面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。
面向对象有三大特性,封装、继承和多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦--为了解除父子类继承的耦合度。如果说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
总结一下,如果说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。