前言

  c和c++的区别是什么?不可置否,最重要的就是c++的编程思想是面向对象,而c的编程思想是面向过程,这是它们的本质区别,如果你在使用c++编程时使用的还是面向过程的编程思想,那么还不如使用c,因为这样的做法已经丢掉了c++的思想精髓。在学习一门语言时,最重要的是学习它的设计思想,因为语法都是大同小异的,很快便可以掌握。那么面向过程和面向对象编程的发展历史如何,区别是什么,各自的优缺点是什么,且听我一一道来。

  

一、“自顶向下,逐步求精”的面向过程程序设计

   面向过程程序设计的思想即这样的一种解决思路 - 提出问题,分析问题的处理流程,将大问题分解为小问题,如果小问题比较复杂,就继续划分小问题为更小的问题,然后通过小模块一一解决小问题,最后再根据整个业务流程将这些小问题串在一起(调用函数),这样就达到了解决所有问题的目的,如下:

  于是,这样从问题出发,自顶向下、逐步求精的开发思想我们称之为“面向过程程序设计思想”,因为它主要是解决问题中的一个个过程。这种思想也是最早的编程语言的思想,因为它比较符合我们解决问题的方法,其他语言比如早期的Fortran、JavaScript等都是如此。它的优点如下:

优点1:程序结构简单 - 仅由三种基本结构组成

  面向过程编程的思想在程序实现上只需要三种控制结构,即顺序、选择、循环。通过这三种基本结构,我们就可以解决任何问题,所以我们可以专注于程序逻辑的实现,不需要学习、记忆更多的控制结构。

优点2:分而治之,各个击破

  当我们在解决复杂问题时,通常采用的就是“分而治之”的策略,即把大问题分解为小问题,然后再各个击破这些小问题,这样整个大问题就得到了解决。所以,面向过程程序设计思想也是采用这种“分而治之”的策略,把较大的程序按照业务逻辑划分为多个子模块,然后在分工逐个完成这些子模块。最后按照业务流程把他们组织起来,最终使得整个问题得到解决。按照一定的原则,把大问题细分为小的问题然后“各个击破”,符合人们思考问题的一般规律,其设计结构更易于理解,同时这种方法也易于人们掌握,通过分解问题,降低了问题的复杂度,使得程序易于实现和维护,另外,部分分解后的小问题(子模块)可以重复使用,从而避免了重复开发,而多个子模块也可以由多人分工协作完成,提高开发效率。

  

优点3:自顶向下,逐步求精

  面向过程程序设计思想倡导的方法是“自顶向下,逐步求精”,即从宏观角度考虑,按照功能或者业务逻辑划分程序的子模块,定义程序的整体结构,然后再对各个子模块逐步细化,最终分解到程序语句为止。这种方法可以使程序员全面考虑问题,使程序的逻辑关系清晰明了。它让整个开发过程从原来的考虑 “怎么做” 变成考虑 “先做什么,再做什么”,流程就更加清晰了。

  

缺点:

  但是,一件事物必定有优点也有缺点,面向过程的程序设计当然也躲不过这种规律,并且缺点的凸显往往是在程序的复杂性越来越高时才会出现的,那么这种设计思想的缺点是什么呢?   

  在面向过程程序设计时,数据和操作往往是分离的,这就导致如果数据的结构发生了变化,那么操作数据的函数不得不重新改写,这个代价是非常高的。并且,数据往往不具有封装性,很多变量都会暴露在全局,加大了被任意修改的风险。另外,一旦涉及到模块的重新划分,往往需要修改原来写好的功能模块。且这种数据和操作相互分离的特点使得一些模块跟具体的应用环境结合紧密,旧有的程序模块就很难在新的程序中得到复用。所以,这些固有的缺点使它越来越难以适应大型的软件项目的开发。正是在这样的历史背景下,一些新的程序设计思想开始不断涌现,而面向对象的程序设计思想就是最重要的一环。

  

二、万般皆对象:面向对象程序设计

  面向对象的程序设计(OOP)是面向过程程序设计的继承和发展,它不仅汲取了后者的精华,而且以一种更加接近人类思维的方式来分析和解决问题:程序是对现实世界的抽象和描述,现实世界的基本单元是物体,与之对应的,程序中的基本单元是对象

     面向对象思想认为:现实世界是由对象组成的,无论大到一个国家还是小到一个原子,都是如此。并且对象都由两部分组成 - 描述对象状态或属性的数据(变量)以及描述对象行为或者功能的方法(函数)。并且与面向过程不同,面向对象是将数据和操作数据的函数紧密结合,共同构成对象来更加精确地描述现实世界,这是面向过程和面向对象两者最本质的区别。

  之前提到面型过程的缺点,即面向过程中数据和操作是分离的,当问题规模比较小时,需求变化不大的时候,面向过程工作都做的很好。 但是,当问题的规模越来越大、越来越复杂时,面向过程就显得力不从心了,即修改了某个结构体,就不得不修改与之相关的所有过程函数,而一个过程函数的修改,往往又会设计到其他数据结构,在规模比较小的时候容易解决,但是当系统规模越来越大时,特别是涉及到了多人协作开发,这就非常困难,这就是著名的软件危机。 正是如此,面向对象的程序设计应运而生,它的主要特点是封装、继承和多态。封装即将数据和操作封装在一起,并避免了局部变量的暴露,而只提供接口;继承可以在原来的基础上很快的产生新的对象;多态是同一个方法调用,针对不同的对象有不同的反应,这方便了程序的设计。

                                 

  如上所示,封装、继承、多态就是面向对象程序设计的三大基石。 它们是紧密相连、不可分割的。通过封装,我们可以将现实世界中的数据和对数据进行操作的动作捆绑在一起形成类,然后再通过类定义对象,很好地实现了对现实世界事物的抽象和描述通过继承,可以在旧类型的基础上快速派生得到新的类型,很好地实现了设计和代码的复用同时多态机制保证了在继承的同时,还有机会对已有行为进行重新定义,满足了不断出现的新需求的需要

  正是因为面向对象思想的封装、继承、多态这三大特性,使得面向对象思想在程序设计中有着不可替代的优势。

(1)容易设计和实现

  面向对象思想强调的是从客观存在的事物(对象)出发来认识问题和分析解决问题,因为这种方式更加符合我们认识事物的规律,所以大大降低了问题的理解难度,而面向对象思想所应用的封装、继承、多态都是符合人类日常的思维习惯的,所以使用面向对象思想设计的程序结构清晰、更容易设计和实现。  

(2)复用设计和代码,开发效率和系统质量都得到了提高

  面向对象思想的继承和多态,强调了程序设计和代码的重用,这在设计新系统的时候,可以最大限度地重用已有的、经过大量实践检验的设计和代码,使得系统能够满足新的业务需求并具有较高的质量。同时,因为可以服用以前的设计和代码,所以大大提高了开发效率。

(3)容易扩展

  开发大型系统的时候,最担心的即使需求的变更以及对系统进行扩展,利用面向对象思想的封装、继承和多态,可以设计出“高内聚、低耦合”的系统结构,可以让系统更加灵活、更容易扩展,从而轻松应对系统的扩展需求,降低维护成本。

  最佳实践:高内聚,低耦合。 这是软件工程中的一个概念,通常用来判断一个软件设计的好坏。所谓的高内聚是指一个软件模块是由相关性很强的代码组成,只负责某单一任务,也就是常说的“单一责任原则”。而低耦合指的是在一个完整的系统中,模块与系统之间,尽可能保持相互独立,即每个模块尽可能独立完成特定的子功能,模块与模块之间的接口,尽可能的少而简单。 

  

c++为什么要面向对象?的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. 166. Fraction to Recurring Decimal (Math)

    Given two integers representing the numerator and denominator of a fraction, return the fraction in ...

  2. [leetcode]56. Merge Intervals归并区间

    Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...

  3. Redhat学习(此为草稿,正式笔记之后存放)

    系统组成 版本XX.XX.XX XX主版本,XX副版本(奇数为测试版,偶数为稳定版),修订版本号 , 表示修改的次数(debug) linux主流分支 硬盘分区 /dev/ 硬件设备所在分区 hd 表 ...

  4. Linux-目录结构及文件系统

    1.Linux 系统的顶层目录结构 /              根目录 ├── bin     存放用户二进制文件 ├── boot    存放内核引导配置文件 ├── dev     存放设备文件 ...

  5. 深入理解JVM(六)类文件结构

    6.1 关于类文件 1.class文件的一次编译,到处运行的跨平台性: 2.JVM不止有跨平台性,还有跨语言性,不管是JRuby还是Groovy写出来的程序,只要编译出符合JVM规范的class文件就 ...

  6. 2018上IEC计算机高级语言(C)作业 第3次作业

    2018上IEC计算机高级语言(C)作业 第3次作业 一.例程调试(20分) 调试下面2个例程,各位同学调试用自己的学号模3(即除以3取余数)加1序号及该序号乘以2的题.写明调试过程,如错误现象(如给 ...

  7. Android 常用RGB值以及中英文名称

    Android 常用RGB值以及中英文名称   Android   常用 RGB值以及中英文名称     颜   色     RGB 值 英文名 中文名     #FFB6C1 LightPink 浅 ...

  8. HTML中的table导出为Excel文件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. c++类对象的内存分布

    要想知道c++类对象的内存布局, 可以有多种方式,比如: 1)输出成员变量的偏移, 通过offsetof宏来得到 2)通过调试器查看, 比如常用的VS 1.没有数据成员的对象 class A{ }; ...

  10. 后台获取url里面加密的参数中,特殊符号+获取到后端后是 一个空格的解决方法

    进行加密,加密后的参数中有个+号: 前端的url:http://mtest.cmread.com:8145/nap/p/QRcode.jsp?activityId=11206&vcode=O/ ...