?
内容简介1、第二部分第二课:掀起了类的盖头来(一)(上)
2、第二部分第二课预告:掀起了类的盖头来(一)(下)
掀起了类的盖头来(一)(上)上一课《第二部分第一课:面向对象初探,string的惊天内幕》中,我们对面向对象有了初步的认识。当然,我们只是远观,还没有亵玩焉。
我们说道:面向对象的编程模式可以让我们把复杂的实现向用户隐藏起来,用户只需要关心怎么使用就可以了。
这只是面向对象的一个好处。随着我们课时的深入,你会发现面向对象的更多优点。
这一课,就来见见我们的主角--面向对象的重要概念:类。
「掀起了类的盖头来,让我来看看类的颜(眼)。类的颜值高不高呀,经过这两课就见分晓」--小编唱起来了,可还行~
从这一课开始,我们正式来学习创建对象。你会发现面向对象好像是一门艺术,而且需要不断磨砺已达至炉火纯青的境界。
很多程序员声称自己写的程序是基于面向对象的模式,但事实上却留有严重的面向过程的痕迹,抑或设计得不好,并没有发挥出面向对象的所有威力。
其实,我们可以用种不同的方式去创建一个对象,只不过我们力求用最佳的那种。要设计出好的面向对象的程序并不容易,在动手之前需要认真构思。
好了,该是时候跟小编深吸一口气,然后纵情地潜入面向对象的美丽海底世界了!
创建一个类
你会问:我们学的不是面向对象吗?为什么无端跑出一个类来?
类是什么呀?类和对象之间又有什么不可告人的关系呢?
呃...为了创建一个对象,必须先创建类!
解释如下:比如我们要造房子,总得先有设计图纸对吧?这样,类就好比房子的设计图纸,而对象就是根据图纸建造出来的房子。
因此,创建一个类,其实就是画出对象的设计图纸。
只要有了房子的设计图,你就可以依据这张设计图造无数多个房子。类和对象也是这样:一旦你把类设计好了,你就可以依据这个类来创建无数多个对象。如下图所示:
术语:我们说对象是类的实例(实例在英语中是instance),这在面向对象编程领域经常听到。这表明对象是类的具体的物化(房子也是房屋的设计图纸的具体物化)。你会说:这有点抽象吧。那好,我们就来创建一个类看看。
创建一个类,但是创建什么类呢?
首先必须选择一个类来创建。还是以建筑为例,我们可以创建一座公寓,一个带游泳池的别墅,一间阁楼。
选择是很多样的。当我们刚开始学习面向对象编程的时候,我们会有点却步不前,不确定哪些东西可以被看作对象。
但答案却是:几乎所有东西都可以被认为是对象。
既然我们刚开始学,那么小编就擅自做主,替你选择要创建的类吧。
我们首先来创建一个类,叫做Character,是英语人物,角色的意思,例如角色扮演游戏(RPG)里的角色。
如果你没玩过角色扮演游戏,也没关系,并不会影响你学习接下去的例子。我选择Character这个类来做例子,是因为比较形象,也比较有趣。而且,这一课的最后,我们会用这个类来写一个很简单的角色扮演游戏。
在开始创建这个类之前,需要知道一个类是由以下元素组成的:
变量:在面向对象编程领域,又被称为属性,或者成员变量。
函数:在面向对象编程领域,又被称为方法,或者成员函数。
先来展示一个类的最小构成单元:
classCharacter{};//千万不要忘了最后的分号!和函数不一样!
如上所示,就是创建一个类的最基础的代码。
首先,说一下关键字class(英语类别,分类的意思),这是C++用来表明所创建的是一个类的重要指标。
class关键字后面跟着类的名字。这里,类名是Character。
牢记一点:类名的首字母大写。当然了,如果你的类名的首字母是小写,编译也不会出错。这一条规则并不是强制的。但是将首字母大写是很有好处的,不但可以区分类和一般变量,而且可以区分类名和对象名。
类名之后跟着一个大括号,定义了类体的范围,类中的元素都定义在这个大括号里。
还有很重要的一点,大括号的最后不要忘了有一个分号,分号表示类的定义结束。
添加方法和属性
不过暂时Character这个类里面空空如也,还没填充元素。
接下来,我们就在类体(大括号的范围)中填写需要的内容。
填写什么内容呢?
聪明如你肯定知道啦:
属性:也就是类里面的变量。
方法:也就是类里面的函数。
接下来,我们要做的就只是决定要往类体里放什么啦。需要哪些属性和方法呢?这就需要思考了。
设计面向对象的类时,很多人,包括我在内,都习惯拿出一张纸,列出需要属性和方法。
一种特殊的语言,叫做UML(UnifiedModelingLanguage,统一建模语言),就专门用来设计类。
===========
摘自百度百科:
UML是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。面向对象的分析与设计方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。
===========
在类体中先写什么呢?属性还是方法?并没有顺序的约束。不过一般来说先定义属性,然后再定义方法比较符合逻辑。毕竟方法要用到这些属性。
属性
属性描述类的一些特征。当然了,我们可以不断改进,增减这些属性。
对于我们的类Character(RPG游戏中的角色)来说,什么才是描述角色的属性呢?我们可以来头脑风暴一下:
首先,每一个角色都有生命值。我们可以将其命名为mLife。life是英语生命的意思。前面加一个m是一般的习惯,在类的成员变量前加一个m(是member的首字母,表示成员)。当然了,你也可以有自己的命名习惯,例如加m_,变成m_life。加上m或m_这样的前缀有助于区分类的成员变量和一般的变量。生命值应该是一个int型变量,而且一般来说最小值是0,最大值则可以自己定。一旦生命值为0,角色就挂掉了。
在角色扮演游戏中,一般来说角色还有魔法值。我们可以将其命名为mMana。mana是英语超自然力量,神力的意思。魔法值应该是一个int型变量,而且一般来说最小值是0,最大值则可以自己定。一旦魔法值为0,角色就不能施放任何魔法了,只能等待魔法值随时间慢慢回复(当然了,你也可以喝魔方药水来补充)。
我们还可以添加一个属性:角色使用的武器名称。我们可以将其命名为mWeapon。weapon是英语武器,兵器的意思。武器名称应该是一个string型变量。
既然我们的角色有了武器,武器可以对敌人造成伤害。所以我们再添加一个属性,就是武器的伤害值。将其命名为mWeaponDamage。武器的伤害值应该是一个int型变量。一旦使用武器来击打敌人,敌人就会扣除相应生命值。
因此,我们已经可以在Character类中填写如下属性了:
classCharacter
{intmLife;//生命值intmMana;//魔法值stringmWeapon;//武器intmWeaponDamage;//武器造成的伤害值};
对于上面定义的这个类,我们需要知道:
此处我们还不能初始化这些属性。初始化的工作应该交由构造方法来完成,我们马上就会学习。
既然我们在类体中用到了string,因此需要在代码的开头处引入string标准库:#includestring
方法
方法,大体说来就是类可以完成的操作。方法可以读取并修改属性。
列出我们的Character这个类可以完成的操作:
receiveDamage:角色受到了一些伤害,因此丢失一定的生命值。
attack:角色使用武器来攻击另一个角色。对另一个角色每次造成一定伤害值(也就是mWeaponDamage)
drinkHealthPotion:角色喝生命药水,回复一定生命值。
changeWeapon:角色换新的武器,武器的名字和伤害值会变化。
isAlive:如果角色还活着(生命值大于0)返回true;否则返回false
PS:一般在游戏中,生命药水(HealthPotion)和魔法药水(ManaPotioin)长这样:
好的,我觉得这是个不错的开始。
我们将这几个方法写入我们的Character类中,并置于属性之前。通常,在面向对象编程中,我们习惯将类的方法放于属性之前。当然了,你也可以将方法放在属性之后,这只是习惯问题,并不强制。
classCharacter{//方法voidreceiveDamage(intnbDamage){}voidattack(Charactertarget){}voiddrinkHealthPotion(intpotionQuantity){}voidchangeWeapon(stringnewWeaponName,intnbNewWeaponDamage){}boolisAlive(){}//属性intmLife;intmMana;stringmWeapon;intmWeaponDamage;};
暂时,我们还没有在Character类的各个方法体中添加代码,我们等会写。
第二部分第二课预告今天的课就到这里,一起加油吧!
下一课我们学习:掀起了类的盖头来(一)(下)
eague
程序员联盟白癜风治疗方案北京哪里治疗白癜风较好