【c++基础】7.类和对象——面向对象的理解

来源:互联网 发布:win7网络打印被挂起 编辑:程序博客网 时间:2024/06/07 02:38

【一】面向对象


在学习类和对象之前,我觉得很有必要将先了解一下面向对象,了解了面向对象,再去学习类和对象,这样带着需求去学习的效果会好一点,我一开始学习c++的时候就是直接就学习如何定义类,如何使用类和对象,当时还不知道面向对象的思想,编程都只会面向过程,以致于很长一段时间我觉得c++中的类就是多余的,用几个简单的函数就能高效完成的事情,为什么要花很多心思去设计一个类呢?这也许也是你现在的疑问,没关系,慢慢来,这篇文章不强求你直接接受面向对象的思想,但至少让你了解什么是面向对象,以后你会慢慢了解其真正的威力的。

1.何为/为何/如何面向对象

以下内容参考自:百度百科
面向对象是一种软件开发方式,是一种软件设计和编程思想,与之相对的就是面向过程的编程思想。早期的计算机编程基本上都使用面向过程的方法。

面向过程的编程思想主张将程序看成是一系列函数的集合,或者一系列对电脑下达的命令,在处理问题时,函数与处理的数据是分离的,所采用的设计思路不是将客体(或对象、实体)作为一个整体,而是将依附于客体之上的行为抽取出来,以功能为目标来设计构造应用系统。这种做法导致在进行程序设计的时候,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种变换过程,不仅增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路。另外,再仔细思考会发现,在任何一个问题域中,客体是稳定的,而行为是不稳定的。

例如,不管是国家图书馆,还是学校图书馆,还是国际图书馆,都会含有图书这个客体,但管理图书的方法可能是截然不同的。结构化设计方法(面向过程)将审视问题的视角定位于不稳定的操作之上,并将描述客体的属性和行为分开,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。面对问题规模的日趋扩大、环境的日趋复杂、需求变化的日趋加快,将利用计算机解决问题的基本方法统一到人类解决问题的习惯方法之上,彻底改变软件设计方法与人类解决问题的常规方式扭曲的现象迫在眉睫,这是提出面向对象的首要原因。

面向对象的思想将客体作为程序设计的主题,每个客体都有属性和方法,通过封装将其属性和方法联系在一起,显然这更符合人类看待事物的视觉,在现实世界中,一切事物都是对象,事物都有属性和行为,通过类将这些属性和行为封装起来对事物进行抽象。

通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。通过面向对象的方法,更利于用人理解的方式对复杂系统进行分析、设计与编程。同时,面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

总而言之,面向对象是一种新的思维方式,是以客体为中心的编程思想。当你真正理解面向对象并熟悉之后,你将会发现,面向对象中的封装、继承和多态,是多么的理所当然,一切都和显示相吻合,你甚至会离不开他并且觉得没有对象的编程简直难以想象。

2.面向对象思想的好处

(1).一个更好的审视问题视角
通常人类观察问题的视角是这些客体,客体的属性反应客体在某一时刻的状态,客体的行为反映客体能从事的操作。这些操作附在客体之上并能用来设置、改变和获取客体的状态。任何问题域都有一系列的客体,因此解决问题的基本方式是让这些客体之间相互驱动、相互作用,最终使每个客体按照设计者的意愿改变其属性状态。

(2).更好的抽象方法
面向对象的抽象是将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟。

(3).封装性
面向对象的封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。该逻辑单元负责将所描述的属性隐藏起来,外界对客体内部属性的所有访问只能通过提供的用户接口实现。这样做既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性。只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响。

(4).更大力度的可重用性
可重用性标识着软件产品的可复用能力,是衡量一个软件产品成功与否的重要标志。当今的软件开发行业,人们越来越追求开发更多的、更有通用性的可重用构件,从而使软件开发过程彻底改善,即从过去的语句级编写发展到现在的构件组装,从而提高软件开发效率,推动应用领域迅速扩展。

3.需要指出的是

面向对象的方法提高了程序设计的编码效率,主要是从人的思维方式出发的,但是对于计算机,面向对象的有些东西往往是冗余的而比面向过程效率要底,但这种效率的损失在面向对象带来的好处面前很多时候是微不足道的。


【二】类和对象


这里只是类和对象的概述,下一章具体介绍类的实现和对象的使用。

1.类

有了上面面向对象的背景,我们怎么实现面向对象呢?面向对象的实现主要体现在实体的封装性、继承性和多态性。

对象,从字面意思也可以看出,它是对客观事物的抽象,每一个客观事物都是一个对象,比如说:一个人、一本书、甚至一个原子……除了具体实物,还可以是抽象事务,如一次约会、一个演讲、一个字符串等,任何现实世界中的东西(只要你能想到)都可以映射到c++语言世界中,所以,当你真的在语言世界里创造、遨游时,你会发现写代码比打游戏爽多了。

类的封装性

我们在c++语言世界里创造的时候是不是每一个实体我们都得新写一个对象呢?比如10个人我们是不是要写十个对象呢?不需要,因为10个人都是一类,都是人,对,就是类,我们将具有相同特性(数据元素)和行为(功能)的对象的抽象成类,通过类来进行实体的封装,类具有的属性和操作,前者是对象的状态的抽象,用数据结构来描述类的属性,在c++中叫成员数据,后者是对象的行为的抽象,用操作名和实现该操作的方法来描述,c++中叫成员函数。

class calssName{//成员数据...//成员函数...}

类的继承性

现实世界中,实体之间总会存在一些联系,这些联系可以用

“is a”和“has a”

来表示,比如people“has a”eyes,coder“is a”people。假设现在你已经将eyes抽象为一个类了,当你要写一个people的类,就应该使用组合的聚合方式,也就是eyes类应该是people的一个成员数据,意思是eyes是people的一部分。现在你要写一个coder的类,那么应该使用继承方式,继承people的数据和方法,意思是coder是一个people。

类的继承性就是说类可以通过继承来使用父类的方法,被继承的类叫父类(或基类),继承的类叫子类(或派生类),继承的聚合方式表示子类“is a”父类。有时候会将继承和派生放在一起说,其实他们是相同的概念从不同的角度讨论,子类继承自父类,父类派生出子类,就是是这样的关系。

class eyes{};
class people{//成员数据eyes my_eyes;   //组合...//成员函数void talk();void run();...}
class coder public people{  //公有继承自people}

类的多态性

假设现在已经写了一个people类,又写了一个coder类和teacher类继承自people,分别new了(实例化)一个people、coder、teacher对象,此时可以将coder或teacher对象的实例赋值给people对象,赋值之后,people就是一个coder或teacher,这就是多态性,一个对象可以有多种状态。

也就是说,多态性允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。

类是一种数据类型

类是一种自定义数据类型,也就是说,类一旦定义之后,就可以像使用基本数据类型(如int)一样的使用。c++中可以使用calss和struct来进行类的定义,两者的区别在于,在不加可见性限制的前提下,class默认为private,而struct默认为public。

2.对象

对象是对现实世界中实体的抽象,类是对象的抽象,对象也是类的实例化,这就是类和对象的关系。对象也是一个变量,其类型时它实例化的那个类类型。

class people{};    //定义people类class girl public people{};    //定义girl类,公有继承自people类people girl_friend=new girl;   //new一个女朋友