C++学习笔记----4、用C++进行程序设计(一)---- 什么是面向对象的程序设计

        也许你看到这个题目的时候,就觉得这篇博文不用看了,难道这就是题目劝退了观众。我看到过一些程序,是由面向过程的传统程序修改过来了,只是将原来的函数变成了类的成员函数,其他几乎没有什么变化,可以说是换汤不换药。可以说,会用类进行程序编写说明你掌握了C++的语言基础,但使用面向对象的方法进行程序设计才是你真正掌握了学习C++的精髓。面向对象的程序设计主要思想还是类间的关系,以及整体设计是面向对象。

        由面向过程的程序过渡到面向对象的程序设计,即使你已经使用类多年,也不能说明你在程序设计过程中完全使用的是面向对象的思维,程序设计类之间的关系决定了你掌握面向对象的程度,在面向对象程序设计过程中程序员碰到的一些陷阱等我们也会涉及。

        面向对象与面向过程的程序设计方法的最大的不同点就是真实程序中不同解决问题的方式。而不是陷于对于类与对象等面向对象程序设计的名词的理解。

1、我是否在用面向过程的思维在思考

        面向过程的编程语言,比如C,将代码分为各个小的部分,理想情况下,每个部分完成一个单独的任务。在C语言中,如果没有过程,所有的代码都会堆到main()函数中。这样的代码难于阅读,阅读你代码的同事至少不会太开心。

        其实电脑根本不关心你的代码是都在main()函数中还是分成了各个部分,各个部分都具有描述性的名字与注释。过程就是帮助你、程序员和那些阅读与维护你的代码的人等存在的抽象。其概念就是围绕你的程序的基本问题进行的构建--程序是干什么用的?用人话来说的话就是,用面向过程的思维思考。例如,通过回答如下问题开始设计一个股票选择的程序:首先,程序从互联网上获得股票报价,然后,以特定的方式对数据进行排序;接着,对排序数据进行分析,最后,输出买卖的推荐方案。当开始编码的时候,你可能就将以上的思维模型转化成C函数:retrieveQuotes(), sortQuotes(), analyzeQuotes(),和outputRecommendations()。

        即使C中的过程就是指的函数,但C不是函数语言,函数这个术语与过程不同,指的是像Lisp这样的语言,该语言保用了完全不同的抽象。

        过程的方法倾向于让你的程序按照一定的步骤运行。然而,一般来说,现代应用很少是线性的事件顺序。通常情况下用户可以在任何时间执行任何命令。面向过程的思维也不涉及到数据表示。像上面的那个例子,实际上就没有对于股票报价的讨论。

        如果思维的过程模式听起来像是你与程序打交道的方式,也不要担心。一旦你意识到OOP只是另外一种更灵活的软件思维方式,就会很自然地接受了。

2、面向对象学说

        不像面向过程的方法是基于“程序是做什么的”的问题,面向对象的方法是要问另外一个问题:“我要把真实世界当中的对象怎样进行建模?"。OOP是基于你将程序分成物理对象而不是分成任务的符号表达。一开始看起来比较抽象,当你用类、部件、属性与行为等术语来考虑物理对象时就会变得越来越清晰。

2.1、类

        类是区分对象的定义。我们看一下桔子,我们如果只是通常讨论它长在树上,是一种美味的水果,与讨论一个特定的桔子,如正在把汁液滴在了我的键盘上的那个桔子,完全不是一回事儿。

        如果你来回答“什么是桔子?”,你是在讨论Orange这个类。所有的桔子都是水果。都长在树上。都是橙色的,都有特定的味道。类就是定义了一类物体的包装。

        当描述某个特定的桔子时,就是讨论一个对象。所有的对象属于一个特定的类。因为在我书桌上的对象是一个桔子,我知道它属于桔子这个类。这样的话,我就知道它是长在树上的水果。我还可以说它是一种中等色调的橙色,味道好极了。对象是类的一个实例,一个带有区别于同类的其他实例的具有特性的元素。

        举一个更具体的例子,考虑一下上面的股票选择的应用。在面向对象的程序设计中,“股票报价”就是一个类,因为它定义了构成报价的抽象符号。一个特定的报价,像“当前的科顺股份的报价“就是一个对象,因为它是类的一个特定实例。

        从C转过来的同学,会把类与对象类比成类型与变量。实际上,类的语法与C结构的语法类似。

2.2、部件

        如果考虑复杂真实世界中的对象,比如一架飞机,非常容易地能够看出,它是由许多小的部件构成。有机身、控制台、起落装置、发动机以及数不清的其他部件。在面向对象的程序设计中把对象分成小的部件很重要,就像在面向过程的程序设计中把复杂的任务分成小的过程一样。

        部件与类一样重要,只是更小更具体。好的面向对象的程序可能会有一个Airplane类,但是如果用它来描述一架飞机的话就太大的,Airplane类处理许多更小的更易管理的部件。每个部件可以有子部件。例如,起落装置是飞机的部件,轮子是起落装置的部件。

2.3、属性

        属性用于区别对象本身与其它对象。回到上面的Orange类,回想一下所有的桔子都是橙色的,有特殊的味道。这两个特点就是属性。所有的桔子都有相同的属性,只是带有不同的值。我的桔子的味道好极了,而你的桔子可能坏了,味道难闻。

        你也可以在类的层次上思考属性。前面提到过,所有的桔子都是水果,长在树上。水果类有属性,具体的味道由具体的水果对象决定。类的属性由类的所有对象分享,而类的所有对象都有属性,只是其值不同。

        在股票选择的例子中,一个股票报价类有几个对象属性,包括公司名字,行情显示代号,当前价格,以及其他统计信息。

        属性用于描述对象的特点。回答了”什么使得这个对象不同于其他对象?“的问题。

2.4、行为

        行为回答了如下两个问题:”这个对象做什么?“和”我能对这个对象做什么?“,对于桔子的那个例子,它干不了什么,但我们可以对它干一些事儿。一个行为就是它能吃。像属性,你可以认为是在类层次上或者对象层次上的行为。所有的桔子可以以相同的方式被吃掉。然而,其他的行为可能是不同的,比如从斜坡上往下滚,非常圆的桔子与扁圆的行为就会不同。

        股票选择的例子提供一些更实际的行为。如果你能记得的话,用面向过程的思维来考虑,就会将分析股票报价变成不同的函数。用面向对象的方式,就会决定股票报价对象分析自身。分析就变成了股票报价对象的一种行为。

        在面向对象的编程中,大量的函数代码被移出过程,移进类中。通过构建具有特定行为并且定义了交互性的类。OOP提供一更丰富的技巧将代码作用于数据上。类的行为通过类成员函数来实现。

        我们再次声明,在Java中,只能通过类的方式来进行程序设计。但在C++中,既可以用类的方式来进行面向对象的程序设计,也可以用面向过程的方式来进行程序设计,将其分解成用函数来表达的过程就可以了。实际上,C++标准库都是单独的函数,比如,标准库的所有算法。

2.5、综合实例

        利用这些概念,可以将股票选择程序用面向对象的方式进行重新设计。

        如前讨论,”股票报价“可以是一个开始的比较好的类。为了得到报价的列表,程序需要一组股票报价的符号,通常叫做Collection。好的设计应该有一个能够表达"股票报价的Collection",由更小的能够表达单个”股票报价“的部件构成。

        现在来说属性,collection类至少要有一个属性,接收到的报价列表。也可以有更多的属性,比如最近访问的日期与时间。至于行为,"股票报价的Collection"能够与服务器通信获得报价,提供报价的排好序的列表。这些就是“retrieve quotes” 与“sort quotes”行为。

        股票报价类具有了前面讨论的属性--名字、符号、当前报价等等。还有,它还有一个分析的行为。也可以考虑其他行为,比如买进股票、卖出股票。

        生成显示部件之间的关系的图很有用。下图使用了UML类图来展示一个StockQuoteCollection包含了0个或多个(0..*) StockQuote对象,一个StockQuote对象属于一个单独的StockQuoteCollection。

        我们再看一下前面提到的桔子的例子,桔子有像颜色与气味的属性,也有被吃或滚的行为。你还可以给它加上像扔、削皮、挤压等行为。还有一个桔子的属性:桔子种子集合。下图给出了Orange与Seed类的UML类图,包括相互之间的关系,一个Orange包含0个或多个(0..*) Seed,一个Seed属于一个单独的Orange。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/870906.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【leetcode详解】T3137(思路详解 代码优化感悟)

思路详解 要解决这个问题,我们的大致思路是这样:找到长度为k的字符串 (记为stringA) ,统计重复次数最多的那一个,则最终对应的k周期字符串就是 [stringA * n] 的形式( n word.length() / k) 要实现多对象的计数&…

easyexcel--导入导出实现自定义格式转换

自定义格式 我们在数据库设计的时候经常会有枚举类型,如0表示普通用户,1表示VIP用户等,这在excel导入的时候,我们会填普通用户而不是0,这样就需要用到自定义格式把普通用户转换成0,我写了一个通用的抽象类…

LabVIEW多协议智能流水线控制与监控系统

在自动化流水线系统,实现对流水线传送带、机械臂、报警系统、扫码机、喷码机等设备的高效控制和实时监控。该系统需要支持多种通信协议,包括UDP、串口、ModbusTCP、HTTP、以及MQTT协议,以确保各个设备间的无缝连接和数据交换。 系统架构与模…

软考:软件设计师 — 14.算法基础

十四. 算法基础 1. 算法的特性 算法是对特定问题求解步骤的描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。 有穷性:执行有穷步之后结束,且每一步都可在有穷时间内完成。确定性:算法中每一条指令必须有…

使用对比!SLS 数据加工 SPL 与旧版 DSL 场景对照

作者:灵圣 概述 如前一篇《SLS 数据加工全面升级,集成 SPL 语法》所述,SLS 数据加工集成了 SLS 数据处理语法 SPL。与旧版本数据加工 DSL 相比,SPL 在处理非结构化数据的场景中,其语法简洁度上有很多提升&#xff0c…

Linux ubuntu 24.04 运行《文明5》游戏,解决游戏中文设置的问题!

Linux ubuntu 24.04 运行《文明5》游戏,解决游戏中文设置的问题! 《文明5》是一款回合制经营策略游戏,拼的就是科技发展速度,点的是科技树,抢的就是科技制高点,但是真的是时间漫长,可能需要好几…

游戏开发之性能优化

游戏开发中的性能优化是一个复杂且多方面的过程,涉及到多个层面的改进和调整。以下是一些主要的优化技巧和方法: 代码优化: 缓存计算结果:对于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑,使用缓存可以显著提高性…

UniformSampling 均匀采样滤波(附PCL库的C++代码)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、原理二、算法步骤三、算法实现参考链接前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对UniformSam…

XSS游戏

目录 XSS游戏-WarmupsMa Spaghet!JefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafiaOk, BoomerWW3 XSS游戏-Warmups Ma Spaghet! 1. 尝试注入&#xff0c;输入aaaaaaaa 2. 显示在<h2>标签内3. 输入标签&#xff0c;添加onmouseover属性值为alert(1337)&…

物流抓取机器人整体设计方案

一、功能简介 1、运行环境&#xff1a;巡线行驶&#xff08;7路数字循迹&#xff0c;麦克纳姆轮车底盘&#xff09; 2、目标识别&#xff1a;颜色识别&#xff08;Maix-II Dock 视觉模块&#xff09; 3、目标定位&#xff1a;视觉测距&#xff08;Maix-II Dock 视觉模块&#x…

mov和mp4有什么区别?如何实现mov格式转mp4格式?

每种视频格式都有自己的特点&#xff0c;尤其是mov和mp4这两种格式&#xff0c;它们如同两种各具特色的语言&#xff0c;各自拥有独特的表达方式和优势&#xff0c;使得视频内容能够根据不同的需求和场景&#xff0c;以最佳的方式呈现给观众。 mov作为苹果公司开发的音频、视频…

VBA技术资料MF185:图片导入Word添加不同格式说明文字

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

这些星座比你想象的还努力

TOP 3. 金牛座   金牛座对于操劳操心的忍受度本来就比较高&#xff0c;对于金牛座来说这些都是踏实的象征&#xff0c;金牛座比较不相信不劳而获这件事情&#xff0c;多少血汗多少付出&#xff0c;得到多少收获&#xff0c;这让金牛座比较踏实&#xff0c;不会觉得很不安&…

三、LogicFlow 基础配置介绍及实现一个基础 Demo

目录 前置LogicFlow 介绍LogicFlow基础配置引入方式核心包基础概念实例&#xff08;配置项&#xff09;节点边&#xff08;节点与节点之间的连线&#xff09;背景网格主题事件 插件包 实现基础Demo最后 前置 这一篇主要是对 LogicFlow 的一些功能及配置相关的介绍&#xff08;…

基于vue框架的爱心献血管理系统gyx4y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,公告信息,献血车动态,献血预约,献血记录 开题报告内容 基于Vue框架的爱心献血管理系统 开题报告 一、课题名称 基于Vue框架的爱心献血管理系统 二、研究背景与意义 研究背景&#xff1a; 随着医疗技术的不断进步和各类突发事…

前端框架(三件套)

学习网站 HTML 系列教程&#xff08;有广告&#xff09; HTML&#xff08;超文本标记语言&#xff09; | MDN (mozilla.org)&#xff08;英文不太友好&#xff09; 1.HTML5 & CSS3 1.1HTML5表格 <!DOCTYPE html> <html lang"en"> <head>…

教你如何使用C语言实现--多个字符向中间汇聚成句(Sleep与sysem函数)

目录 前言 一、实现思路 二、两个新函数 1.Sleep()函数 1.1 sleep 函数的基本语法&#xff1a; 1.2 示例 2.system()函数 2.1 system()函数的介绍 2.2 system函数清理屏幕 2.3 示例 三、代码实现 总结 前言 前面我们已经学到了C语言的数组&#xff0c;今天我们就可以…

测试面试题集锦(五)| 自动化测试与性能测试篇(附答案)

简介 本系列文章总结归纳了一些软件测试工程师常见的面试题&#xff0c;主要来源于个人面试遇到的、网络搜集&#xff08;完善&#xff09;、工作日常讨论等&#xff0c;分为以下十个部分&#xff0c;供大家参考。如有错误的地方&#xff0c;欢迎指正。有更多的面试题或面试中遇…

Your local changes would be overwritten by merge git

方法二 直接覆盖本地的代码&#xff0c;放弃自己本地的改动&#xff0c;只保留服务器端代码 直接回退到上一个版本&#xff0c;再进行pull。 【步骤】 直接 VCS -> Git -> Reset HEAD… 选择需要的reset模式&#xff1a;hard&#xff08;即放弃本地代码&#xff0c;新修…

如何挑选高性价比蓝牙耳机?四款2024出众耳机品牌盘点推荐!

在数字化时代&#xff0c;蓝牙耳机已成为我们日常生活中不可或缺的一部分。无论是通勤路上、运动时&#xff0c;还是工作学习中&#xff0c;一款好的蓝牙耳机总能给我们带来极致的音乐体验。然而&#xff0c;面对市面上琳琅满目的产品&#xff0c;在预算有限的情况下如何挑选高…