c++为什么要面向对象?

前言

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

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

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

c++为什么要面向对象?

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

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

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

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

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

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

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

缺点:

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

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

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

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

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

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

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

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

(1)容易设计和实现

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

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

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

(3)容易扩展

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

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

Original: https://www.cnblogs.com/zhuzhenwei918/p/9109917.html
Author: Wayne-Zhu
Title: c++为什么要面向对象?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535536/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++调用C#的动态库dll

    以往我们经常是需要使用C#来调用C++的dll,这通过PInvoke就能实现。现在在实际的项目过程中,有时会遇到在C++的项目中调用某个C#的dll来完成特定的某个功能,我们都知道…

    C++ 2023年5月29日
    086
  • C++入门笔记

    一直对C++感到很恐惧,大学里有C的基础,今天终于鼓足勇气入门C++,先大致了解一下,以后用到的时候再详细深入。 Android中有一些很火的领域比如:音视频、物联网,都会涉及到J…

    C++ 2023年5月29日
    063
  • c++函数式编程 笔记

    函数可以看作是一个普通变量。可被存储在集合或结构中,作为参数传递给其他函数,或作为函数的返回值。高阶函数:能够 接收函数作为参数或者 返回函数作为结果的函数。 filter:过滤后…

    C++ 2023年5月29日
    049
  • 面向对象C++编程与实践考试题目

    一、选择题(每题2分,共2×20=40分) (1) 以下不能对数组 a 进行正确初始化的语句是( )。A. int a[2][3] = { 0 };B. int a[ ][3] =…

    C++ 2023年5月29日
    043
  • Kruskal算法(二)之 C++详解

    在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。 例如,对于如上图G4所示的连通网可以有多棵…

    C++ 2023年5月29日
    058
  • C++多线程库的常用类 std::mutex

    格式:类名 + 头文件 + 用例 + 解释说明 解释说明: std::mutex C++提供的互斥量,用在多线程编程中,来保护共享数据。 C++中通过实例化 std::mutex创…

    C++ 2023年5月29日
    050
  • 配置 Windows 下的 nodejs C++ 模块编译环境

    Python 安装 python-2.7.7.msi iso 虚拟磁盘 安装 DTLite4491-0356.exe Windows XP 用 DTLite 打开 VS2010Ex…

    C++ 2023年5月29日
    059
  • C++11:lambda表达式详细介绍

    优点如下: 声明式编程风格:就地匿名定义目标函数或函数对象,有更好的可读性和可维护性。 简洁:不需要额外写一个命名函数或函数对象,,避免了代码膨胀和功能分散。 更加灵活:在需要的时…

    C++ 2023年5月29日
    047
  • 在 C++Builder 工程里调用 DLL 函数

    调用 Visual C++ DLL 给 C++Builder 程序员提出了一些独特的挑战。在我们试图解决 Visual C++ 生成的 DLL 之前,回顾一下如何调用一个 C++B…

    C++ 2023年5月29日
    067
  • C++ 硬核知识点: 数据段/代码段/内存分配/虚函数/继承/多态

    结构体struct和类class占用内存大小解析 今天面试遇到一个比较有意思的问题, 这里安排一下空结构体和空类占内存大小是多少? 答案:1. C++指定空结构体和空类所占内存大小…

    C++ 2023年5月29日
    090
  • C++ 内存池 — C++ Memory Pool

    这是我翻译的文章,来自 Code Project, 原文作者: DanDanger2000. 原文链接: http://www.codeproject.com/cpp/Memory…

    C++ 2023年5月29日
    080
  • Windows 8 添加隐私策略(C++版)

    well.新年上班第一天.不幸收到MS官方针对我们Snack Cards应用程序被打回消息.看看Report 内容如下: The app has declared access t…

    C++ 2023年5月29日
    060
  • C+++string类如何判断字符串为空

    string类是C++STL类之一,有很丰富的接口。 string类为空,实际也就是元素为0个。 可以按照如下方式判断: 1、string类有自己的成员函数empty, 可以用来判…

    C++ 2023年5月29日
    064
  • C++ 内联函数解析(inline)

    inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单。说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函…

    C++ 2023年5月29日
    044
  • Cannot find a C++ compiler that supports both C++11 and the specified C++ flags.

    Linux 安装 cmake 时候出现的问题,解决方法: yum install gcc-c++ Original: https://www.cnblogs.com/hunttow…

    C++ 2023年5月29日
    055
  • VC++每个版本对应的库

    cpp;gutter:true;msvcp、msvcr60、71和80.dll,以及vcomp.dll(不带数字版本号)属于VC++2005版msvcp、msvcr、vcomp90…

    C++ 2023年5月29日
    064
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球