干货分享 |  【基础篇】对象和类——从“啥是佩奇?”开始说起

晶晶言言是我的宝 2019-02-16 13:58:02

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


猪年伊始,相信大家的朋友圈都被《啥是佩奇》刷屏了。讲述了一个爱与团聚的故事。好吧,我这里的这篇小文不是告诉大家如何去买春运的票,也不能让大家说服固执的老人,而是告诉大家如何如何去写代码:

刚入职的时候,师傅也许就告诉你佩奇就是一个红猪,要你独自开发一个佩奇礼物的实例,你是否也像这位老爷子一样不敢对下刷子呢?

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


这时候我们就需要了解类和对象的概念了

类,就是具有相同属性和方法的对象的集合

对象则是这类方法的实例

简单说:而猪是一个基类(父类),佩奇是从猪类中集成出来的派生类(子类),老爷子生产出来的钢铁佩奇则是佩奇类再次派生出来类的对象。

我们来看看,如何从“猪”到“钢铁佩奇”吧。

首先,“佩奇”作为一个“猪”,可以沿用的包括“头”、“躯干”、“尾巴”等等属性和方法,但是我们知道,佩奇和普通猪并不相同,首先,它是一个粉红色的;其次,它的头像一个吹风机;还有,四肢短小纤细……

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


我们现在有一个Pig类,使用关键字class声明,放在大括号{}内。可以使用private、public和protect对变量或者成员函数进行修饰。使用public修饰的成员变量,在程序的任何地方都可以被访问,也就是说可以直接被外界调用,这样很不好,我们通常的做法是把数据隐蔽起来,而把成员函数作为对外界的接口。也就是说,使用private修饰成员变量,这些成员变量不可以被外界直接访问,而需要通过成员函数进行访问。还有一类protected变量,则是受保护变量,在继承时可以访问,但不允许外界直接访问。

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


这时我们知道佩奇为粉红色,我们是否还需要“void SetColor(color color){itscolor=color;}”呢?显然不需要,只需要直接给出颜色就行。这种做法叫做重载。

重载可以使用同样函数名,但参数不同(数量不同或者类型不同)。在子类中,也可以新增一些变量和函数,比如我们可以描述佩奇的头部,大约如下:

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


这里的void SetColor()就是对之前void SetColor(color color)的重载。

注意,重载并不只是发生在继承过程中,我们也可以在同一作用域中声明几个类似的同名函数,而这些同名函数的形参列表不同。这里的part DescribeHead(shape eyes,shape mouth)和part DescribeHead(shape eyes,shape mouth,shape nose)就是典型的重载。

当然,如果在子类中使用了和父类相同的函数,这种做法称为重定义。比如color GetColor(),这时父类中的函数就被隐藏起来。

还有一种情况,例如我们知道在子类中必须实现,而父类不便于实现的函数,我们可以在父类中使用virtual关键字声明为虚函数,这时,我们称在子类中实现的过程为重写(覆盖)。

在C++语言中允许“多重继承”,也就是说,一个派生类可以允许有多个直接基类。

比如要实现我们钢铁佩奇的实例,需要从PeppaPig和Material类中继承。如:

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


这里,我们再介绍一个不定参数的概念,因为不确定需要多少步骤实现佩奇的制作工艺,因此参数的数量不能限制,用“...”表示,使用宏va_start,va_arg和va_end进行控制。由于此时并不能确定参数的数量,因此将可变参数压入堆栈,使用指针遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来。

其中va_start表示第一个可变参数地址;argptr指针上移一个_INTSIZEOF(method),直至最后,使用va_end(argptr)置空argptr,大致的含义与argptr=(void *)0类似。

当然,最重要的一步就是将这个类实例化:

【基础篇】对象和类——从“啥是佩奇?”开始说起。。


其中“.”表示调用了实例ipp中的make()方法。

好吧,最后,祝大家学有所成,都能在佩奇之年有所收获。

本人学识有限,如有疏漏,欢迎大家留言评论指正。


热门文章

copyright@2014-2016 emakerzone.com 粤ICP备16121718号-2 公安局备案 粤公网