如何通俗理解C++面向对象编程和类的含义

本文深入浅出地解释了C++中的面向对象编程和类的概念。面向对象编程是一种将问题分解为对象和它们之间的交互的编程思想,而类是这种编程中的核心数据结构,用于封装对象的属性和行为。通过类的实例化,可以创建具有特定属性和方法的对象,如游戏中的角色。相比于面向过程编程,面向对象编程更适用于大型、复杂系统的开发,因为它允许模块化的代码设计和更低的耦合度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何通俗理解C++面向对象编程和类的含义

    C++最重要的特性是增加了面向对象编程的设计,同时还保留了C的优秀特性。面向对象编程是一种编程思想,它不是一种新的编程语言,许多新语言(例如Java,python,C#等)都支持面向对象编程,这里的所说的“对象”可以通俗地理解成现实世界中的万事万物。

       我们通常所说的编程很多都是面向过程编程,(注意这里,面向过程编程和面向对象编程是两种不同的编程思路),把需要完成的一件事分解成多个步骤,为每个步骤编写一个处理函数,当把这些步骤按设计好的顺序组合起来,就把这件事完成了。所以说,在面向对象编程的思想出现以前,人们利用计算机编程解决问题的思路都是围绕解决一件具体的事来做的,为了解决这件事,就要分解成若干个步骤,一步一步实现,最后解决整个事。

       面向对象编程(英文原意为object oriented,object翻译为物品,东西,物件等等,oriented意为面向,导向,以…为方向,故台湾地区多翻译为面向物件编程,比面向对象编程更好理解一些,物件相比对象这个词语更通俗易懂,更能让人联想起生活生产中的各种物品,东西等等)是把程序员看问题的角度改变了,注意是把程序员看待问题的角度改变了,以前编程的核心是集中精力解决一个具体的事,现在不再把注意力放在一件具体的事上,而是把所有和这件事相关的物件都罗列出来,每个物件有什么特性,能干什么活都分析清楚,然后再把他们按照一定的逻辑顺序组合起来,用其各自能干的活来完成这件事。

        面对对象编程最核心的数据结构就是“类”,类可以封装对象的属性和方法,这个说法很官方,通俗理解就是,这个物件所有的特性和能干什么活,例如生活当中说所的“锅”,锅是一个类,这个类中有电饭锅,炒锅,蒸锅等等,我们“实例化”一个类(实例化就是指把属性和方法都填好以后声明出的一个变量),例如厚度1mm,耐温200度,开口直径36cm,带把手,可火烧,圆弧底,可以爆炒肉类,蔬菜(方法),可以用刷锅球洗刷(方法),大家能联想到这是一个炒锅,是的,我们定义了一个炒锅,注意一下,炒锅属于锅,是我们填好了一些属性和方法,让他成为一个炒锅,而不是电饭锅。

        以上的说法已经尽可能讲解的通俗易懂,下面再举一个具体的例子,面向对象编程非常典型的应用场景就是游戏,试想当你玩王者荣耀的时候,你选择了一个英雄,假如这个英雄是“白起”,打开百度百科,你可以看到“白起”的属性介绍如下表所示:

属性

星数

生存能力

★★★★★★★★

攻击伤害

★★★

技能效果

★★★★

上手难度

★★★★

       这些是白起的属性,我们看最明显的特性生存能力和攻击伤害,说明白起抗揍,血量厚,但是攻击能力弱,技能效果和上手难度是平均水平,所以常说的玩的好就是指白起应该冲锋在一线为队友抵挡敌军的攻击,当肉盾用,这就是游戏设计者为白起设计的用途,游戏玩家要明白游戏设计者的意图后,就会玩的风生水起了。

白起这个英雄有什么本事呢?能干什么活,那就看看下面的介绍,

技能信息

图标

反击之镰(被动)

冷却值:0

法力消耗:0

白起造成或受到伤害时会增加能量,提升移动速度和治疗效果,最多可以提升70点移动速度和80%的治疗效果

正在上传…重新上传取消反击之镰

血之回响(1技能)

冷却值:5

消耗:0

白起回旋大镰血洗四方,对范围内敌人造成100/180/260/340/420/500+33%物理加成)点物理伤害,并回复2%的最大生命值,只命中野怪或者小兵效果减半。蓄力时间越久造成的伤害和获得的回复越高,最大可以造成基础值3倍的伤害和获得基础值3倍的回复。被动:白起受伤时有20%几率释放血之回响。

正在上传…重新上传取消血之回响

死神之镰(2技能)

冷却值:14/13/12/11/10/9

消耗:0

白起在指定位置召唤镰刀,镰刀在一定延迟后收回,对范围内的敌人造成200/230/260/290/320/350+100%物理加成)点法术伤害并将其拉回;同时敌人会减少50%移动速度,持续2.5秒。

被动:白起对生命值低于30%的目标会额外造成30%伤害。

正在上传…重新上传取消死神之镰

傲慢嘲讽(大招)

冷却值:40/35/30

消耗:0

白起向指定位置跳跃,增加100点能量并造成300/380/460+100%物理加成)点法术伤害并嘲讽敌人,持续1/1.3/1.5秒(随技能等级成长)嘲讽时间会随着白起的额外生命值增加,每1000点额外生命之额外提供0.2秒嘲讽时长,最多持续2.5秒。

正在上传…重新上传取消傲慢嘲讽

       可以看到,白起的技能实际上就是面对对象编程中所指的方法,游戏设计者设计一个类,这个类叫“英雄”,英雄有属性,生存能力,攻击伤害,技能效果,上手难度等,每个属性给予不同数量的就可以定义这个英雄适合当肉盾,还是适合当射手(一般认为射手攻击距离远,伤害高,但是血量低,不抗揍,适合殿后使用),通过指定不同的伤害值,回血值,拖慢敌人速度几点,持续几秒等等组合起来,形成一个个方法,也就是所说的技能,给白起分配几个技能以后,这个人物就塑造好了,也就是一个类的实例化就完成了,同样的做法还可实例化出一个孙尚香,鲁班等等。

       在面向过程编程中,如果让白起去攻击对方的鲁班,简单点做就是编写一个结构体,把白起的属性实现,写一个“傲慢嘲讽”的函数,写一个“攻击”函数,写一个“走路”函数,然后规划路径,调用“走路”函数,让白起走到A点,再走到B点,再走到C点,到了目的地,调用“傲慢嘲讽”函数,调用“攻击”函数,攻击函数输入参数是鲁班这个结构体变量,调用完以后,鲁班的血量下降多少点,速度降低多少点等等,把鲁班的这些属性参数设计成静态变量就可以保留下来鲁班被攻击后的状态。

       可以看到,为了实现白起攻击对方的鲁班,我们把这件事进行了分解,按照设计顺序完成了每一个步骤后,白起就可以攻击鲁班了。

       可以看到,如果用面向过程编程的方法去玩游戏,会比较繁琐,每完成一件事都要详细规划一个实现过程,工作量很大。若用面向对象编程去实现,看待问题的思路就变了,在这个游戏中,有白起,有鲁班,有路,一共三个物件参与了这个事。白起有属性,白起有技能(方法)白起能攻击(方法),鲁班与白起一样具备以上属性和方法,因为他们用的是用一个类“英雄”,只是参数设计和技能组合上不同。路这个物件(对象)可以设计一下,属性包括起点,终点,相遇点,方法包括相遇(敌我相遇,输入参数包括我方,敌方),错过(敌我错过,输入参数包括我方,敌方)等等。那么“白起攻击鲁班”这个事就变成了:实例化一个路,例如叫“幽暗峡谷”,输入我方参数“白起”,输入敌方参数“鲁班”,调用“相遇”方法,调用白起的“技能”方法(输入参数是死神之廉,傲慢嘲讽等),调用白起的“攻击”方法(输入参数是“鲁班”),一个白起攻击鲁班的事就做完了。

       仔细感受一下,为了完成白起攻击鲁班,两种编程思路是不一样的,面向过程的重心是设计一个程序流程,让白起走到鲁班面前,然后攻击他。面向对象编程是白起能攻击鲁班(有对应的方法),路可以让白起和鲁班相遇(有对应的方法),那实例化这三个对象(白起,鲁班和幽暗峡谷),调用对应方法就可以实现白起攻击鲁班了。

       有的读者进一步思考可能会问:面向对象编程中明显多了“路”这个对象,而面向过程编程中似乎没有感受到“路”的存在。而且一般认知中,路仅仅就是用来走的。确实是这样的,在现实生活中,我们的经验是,我要吃早餐,我应该先从家里出发,走解放路,到包子铺,买包子,吃早餐,这就是面向过程,现实生活中很常见,理解也容易。换个角度看问题后就变成了,我可以吃东西(我有吃东西这个方法),包子铺可以提供包子(有这个方法),解放路可以放置我和包子铺,并且可以决定把我和包子铺放在一起(或者放在相距5m的两个位置等等),如果编程者是上帝,上帝就把解放路拿来,把我和包子铺放在解放路上且放一起,调用我吃包子的方法,好了,现在我吃到早餐了。泛泛地讲(不严谨但有助于理解)面向对象编程不关心过程,只关注怎么完成这件事。这是一种更高层次的抽象认识,把路抽象出来成(假如认为它具备“意识”)一个物件,可以操作“我”和“包子铺”,那么让这几个物件相互一作用,就实现了我吃早餐了。

       所以说面向对象适合大型的程序,做复杂的事务,只需要分解成若干个物件,想干什么就找到干这件事需要的物件,让他们用需要的方法相互作用(每个物件都有很多方法),这件事就干完了,编程变成了搭积木一样的,变得模块化,变得低耦合高内聚(模块相互之间依赖度低叫低耦合,高内聚指模块本身内部代码联系紧密)。

       所以再次强调一下,面向对象编程是一种认识上的进步,是看待这个世界的角度变了,如果读者具备较好的数理化基础,学习过信号处理相关的课程,那么把面向过程比喻成信号的时域,把面向对象比喻成信号的频域,我想再合适不过了,而类这个数据结构是为了适应这种思想而创建出来的,类比信号处理中s变换

2022-05-24

于沈阳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值