何为面向对象?

 概述:所谓对象,是一个名词,任何一个事物都可以称为对象,其有对应的属性(事物的特性)和行为(事物能干什么)。面向对象思想,就是面向事物的编程思想。

1, 面向过程

谈及面向对象,不得不谈的就是面向过程。面向对象是针对名词而言,面向过程则是针对行为动作的处理。

       面向过程是一种以过程为中心的编程思想。所谓过程,就是步骤。当要解决问题或实现目标时,就要进行分析,得到解决所需要的步骤,然后利用函数将这些步骤一步步实现。在处理时,依次调用这些函数即可。

当开发程序规模较小且功能固定时,面向过程的方法有其优势,因为其实现步骤清晰,按照分析的思路可以很好的组织程序。

2, 面向对象

2.1何为对象?

对象是人们要进行研究的任何事物,从最简单的证书到复杂的飞机等均可看做对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件(摘自《c++ primer》)。

对象具有状态和行为。状态即属性,一个对象可用数据值等来描述其状态;行为即操作,用于改变对象的状态值。将属性和操作封装起来就组成了对象。对象是对客观事物的抽象,将具有一致的属性和行为封装在一起就形成了类,即具有相同属性和行为的对象的抽象就是类。类与对象的关系,总的来讲,类是对象的抽象,对象是类的实例。

(1)每一个对象都是某一个类的实例;(2)每一个类在某一个时刻都有零或更多的实例;(3)类是静态的,它们的内容在程序执行前已经定义好,而对象是动态的,它们在程序执行时可以被创建和删除;(4)类是生成对象的模板。

2.2 面向对象概念

       针对面向对象的概念,目前没有统一的说法。狭义上讲,面向对象(OO)是软件开发方法。但面向对象的概念和应用已经远远超出了程序设计和软件开发的范畴,扩展到了数据库系统、应用平台、人工智能等等各个领域。面向对象是一种对现实世界的理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物(摘自编程技术 百度百科)。

       面向对象是面向一个名词(事物)的处理,该事物有属性和行为。定义好事物的属性和行为后,针对事物进行操作,进而完成功能。

2.3 基本特征

(1)封装

       所谓封装,就是将属性和行为包装起来,只提供接口以供调用,隐藏了对象的内部实现细节,起到了数据保密的作用。一方面,外部程序不能随意存取对象的内部属性,避免了外部错误对其的影响;另一方面,当对象内部进行修改时,对象只是通过接口提供服务,减小了其对外部的影响。

一味地强调封装保密,可能会使程序变得臃肿,增加开销。C++中定义了三种可见性:公有(public)、保护(protected)、私有(private),增加了灵活性。公有,成员变量或函数可以被以任何方法访问;保护,只有其本身以及子类可以访问,其他不能访问;私有,只能被其本身访问。

(2)继承

       继承,顾名思义,就是儿子继承老子的遗产。使用现有类的所有功能,并在其基础上对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”,而现有的、被继承的类称为“基类”或“父类”。子类继承了基类的属性和行为,即“儿子继承老子的遗产”,同时在继承的基础上可进行扩展。

       单继承,即单一继承,一个子类只有一个直接基类。

       多继承,一个子类有两个或两个以上的直接基类。这种情况下,子类可以继承多个基类的属性。

       此外,还有菱形继承、虚继承等,关于继承相关理解,在此推荐博客:

1, https://www.cnblogs.com/yjd_hycf_space/p/6721179.html

2, http://blog.csdn.net/monamokia/article/details/51537312

3, http://blog.csdn.net/u013630349/article/details/47057929

 

(3)多态

       C++中,多态是一个接口多种实现,通过虚函数来实现。在基类函数前添加virtual关键字,在子类中对该函数重写,运行时将会根据对象的实际类型而不是指针的类型来调用相应的函数。若对象的类型是子类,调用子类的函数;若对象类型是基类,则调用基类的函数。

注:1,用virtual关键字声明的函数为虚函数,虚函数肯定是类的成员函数;2,纯虚函数是虚函数再加上“=0”;3,抽象类是指包括至少一个纯虚函数的类。

       具体可参考:https://www.cnblogs.com/cxq0017/p/6074247.html

(4)抽象

       对象是对客观事物的抽象,类是对具有一致属性和行为的对象的抽象

3,面向对象与面向过程的区别

       面向过程是分析出解决问题所需要的步骤,然后利用函数将这些步骤一一实现,使用时在依次调用函数;面向对象是把构成问题事物分解成各个对象,建立对象的目的不是为完成某一个步骤,而是为描述某个事物在整个解决问题的步骤中的行为。因此,可以说面向过程是基于动作的处理,而面向对象是基于名词事物的处理,

 

以下例子作解释,要把大象装进冰箱里,有几个步骤:

(A)把冰箱门儿打开。

(B)把大象装进去。

(C)把冰箱门儿关上。

上面每一个步骤,程序员都会用一个「函数」来实现。「函数」是一些代码的集合体,每个函数可以实现一个功能。比如我要定义一个打开冰箱门的函数: openTheDoor()。

所有函数定义好了之后,依次调用就可以了:

openTheDoor();

pushElephant();

closeTheDoor();

需求完成,顺利交工,这是面向过程的处理。但是你以为这样就结束了?如若还需要如下的功能需求呢。

「我要把大象装微波炉里」

「我要把狮子也装冰箱里」

「我要把大象装冰箱,但是门别关,敞着就行」

。。。

如果还是用面向过程的方法来应付,每次需求的变更,程序员就要把整个系统通读一遍,找出可用的函数(如果没有就再定义一个),最后依次调用它们。最后系统越来越杂乱无章难以管理,程序员不堪重负,纷纷操起刀走上了犯罪的道路。

 

面向对象从另一个角度来解决这个问题。它抛弃了函数,把「对象」作为程序的基本单元。那么对象到底是个什么东西呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。描述一台电视,「数据」就是它的屏幕尺寸、亮度,「能力」就是播放《葫芦娃》。

面向对象的世界里,到处都是对象。对象不光有「数据」和「能力」,还可以接受命令。例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。

现在对象有了,如何进行面向对象的编程呢?很简单,依次向不同的对象发送命令就可以了。回到上面的例子,用面向对象来实现,我们会先定义一个「冰箱」对象,它的「数据」就是当前的冷冻温度,或者该冰箱已经有了多少头大象,「能力」就是开门、关门。还有一个「大象」对象,它的「数据」可以是大象的智商、体积,「能力」就是「自己跑到冰箱里去」。然后我们依次:

(A)向冰箱下达「开门」的命令。

(B)向大象下达「进冰箱」的命令。

(C)向冰箱下达「关门」的命令。

 

       但请注意:面向对象也是有一个个过程组合起来的,其具有封装性,需要很大的空间。这个很好理解,再面向事物的处理,最终都是要归结到具体步骤上去。不论是“打开冰箱门”,还是“向冰箱下达开门的命令”,最终都需要开冰箱门,只是解决问题的角度不同。

 

       面向过程与面向对象的优缺点:

(1)      面向过程

优点:流程化使得编程任务明确,在开发之前基本考虑了实现方式和最终结果;效率高,

面向过程强调代码的胆小精悍,善于结合数据结构来开发高效率的程序。流程明确,具体步骤清楚,便于节点分析。

       缺点:需要深入的思考,耗费精力,代码重用性低,扩展能力差,维护起来难度比较高,对复杂业务来说,面向对象的模块化难度较高,耦合度也比较高。

(2)      面向对象

优点:结构清晰,程序的模块化,结构化,抽象化,更加符合人类的思维方式;封装

性,将事务高度抽象,从而便于流程中的行为分析,也便于操作和自省;容易扩展,代码重用率高,可继承,可覆盖;利用接口将数据与代码实现隔离,实现了一定的保密性;实现简单,可有效地减少程序的维护工作量,软件开发效率高。

缺点:效率低,面向对象在面向过程的基础上高度抽象,从而和代码底层的直接交互非

常少机会,不适合底层开发和游戏甚至多媒体开发;复杂性,对于事务开发而言,事务本身是面向过程的,过度的封装导致事务本身的复杂性提高。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值