当前位置: 首页 > news >正文

第四讲:面向对象程序设计方法及类、对象的概念

本讲基本要求

    掌握:面向对象程序设计的方法及特点;类的声明的对象的定义理解:对象的封装、抽象、继承与多态性四个特快性的概念;类和对象的作用;面向对象和面向过程的程序构成。
    了解:面向对象的软件开发。
    重点、难点: 面向对象程序设计的方法及特点;类的声明的对象的定义;类成员函数的性质、定义及存贮方式。

一、面向对象程序设计方法概述 
   

    对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其的操作过程。但是当程序规模较大时,就显得力不从心了。C++就是为了解决编写大程序过程中的困难而产生的。

1、什么是面向对象的程序设计
   问题提出:
对于规模比较小的程序,编程者可以直接编写出一个面向过程的程序,详细地描述每一瞬时的数据结构及对其的操作过程。但是当程序规模较大时,就显得力不从心了。C++就是为了解决编写大程序过程中的困难而产生的。
   解决方法:面向对象的程序设计的思路和人们日常生活中处理问题的思路是相似的。在自然世界和社会生活中,—个复杂的事物总是由许多部分组成的。
   当人们生产汽车时,并不是先设计和制造发动机,再设计和制造底盘,然后设计和制造车身和轮子,而是分别设计和制造发动机、底盘、车身和轮子,最后把它们组装在一起。在组装时,各部分之间有—定的联系,以便协调工作。例如驾驶员踩油门,就能调节油路,控制发动机的转速,驱动车轮转动。这就是面向对象的程序设计的基本思路。

下面先讨论几个有关的概念。

⑴对象

定义:

   客观世界中任何一个事物都可以抽象的看成一个对象(object)。或者说,客观世界是由千千万万个对象组成的。对象可以是自然物体(如汽车、房屋、狗熊),也可以是社会生活中的一种逻辑结构(如班级、支部、连队),甚至一篇文章、一个图形、一项计划等都可视作对象。

说明:
   
1、对象可大可小。
   2、对象可以是自然体也可以是逻辑体。
   3、对象可以嵌套。
   4、对象有两个要素:静态特征称为属性(attribute),动态特征称为行为(behavior)。
   5、控制行为改变的因素称之为消息。要使某一个对象实现某一种行为(即操作),应当向它传送相应的消息。

            
图2.1                   图2.2


   面向对象的程序设计采用了以上人们所熟悉的这种思路。使用面向对象的程序设计方法设计一个复杂的软件系统时,首要的问题是确定该系统是由哪些对象组成的,并且设计这些对象。在C++中,每个对象都是由数据和函数(即操作代码)这两部分组成的,见图2。

⑵封装与信息隐蔽

  1. 可以对一个对象进行封装处理,把它的—部分属性和功能对外界屏蔽,也就是说从外界是看不到的,甚至是不可知的。
  2. 对象进行封装处理做的好处是大大降低了人们操作对象的复杂程度,使用对象的人完全可以不必知道对象内部的具体细节,只需了解其外部功能即可自如地操作对象。
  3. 在设计一个对象时,要周密地考虑如何进行封装,把不必要让外界知道的部分“隐蔽”起来。也就是说,把对象的内部实现和外部行为分隔开来。人们在外部进行控制,而具体的操作细节是在内部实现的,对外界是不透明的。

定义:   
   
“封装”---指两方面的含义:一是将有关的数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相对独立,互不于扰。二是将对象中某些部分对外隐蔽,即隐蔽其内部细节,只留下少量接口,以便与外界联系,接收外界的消息。这种对外界隐蔽的做法称为信息隐蔽(information hiding)。信息隐蔽还有利于数据安全,防止无关的人了解和修改数据。

⑶抽象

   在程序没计方法中,常用到抽象(abstraction)这一名词。其实“抽象”这——概念并不抽象,是很具体的,人们对之是司空见惯的。例如,我们常用的名词“人”,就是一种抽象。
 
定义:

   抽象的过程是将有关事物的共性归纳、集中的过程。

说明:
   1、抽象的作用是表示同类事物的本质。
   2、对象是具体存在的,在C++中,可以将对象抽象类型定义为“类(class)”。类是对象的抽象,而对象则是类的特例,或者说是类的具体表现形式。

⑷继承与重用


   C++提供了继承机制,采用继承的方法可以很方便地利用一个已确的类建立一个新的类,这就可以重用已有软件中的一部分甚至大部分,大大节省了编程工作量。这就是常说的“软件重用(software reusability)的思想,不仅可以利用自己过去所建立的类、而且可以利用别人使用的类或存放在类库中的类,对这些类作适当加工即可使用,大大缩短了软件开发周期,对于大型软件的开发具有重要意义。

⑸多态性

定义:
   
多态性(polymorphism)是指由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。

说明:
   
多态性是面向对象程序设计的—个重要特征,能增加程序的灵活性。

2、面向对象程序设计的特点

   
图3

    面向对象程序设计采取的是另外一种思路。它面对的是一个个对象。实际上,每一组数据都是有特定的用途的,是某种操作的对象。也就是说,一组操作调用一组数据。例如a,b,c是三角形的三边,只与计算三角形面积和输出三角形的操作有关,与其他操作无关。我们就把这3个数据和对三角形的操作代码放在一起,封装成一个对象,与外界相对分隔,正如一个家庭的人生活在一起,与外界相对独立一样。这是符合客观世界本来面目的。

程序设计者的任务包括两个方面:
   
1、设计所需的各种类和对象,即决定把哪些数据和操作封装在一起。
    2、考虑怎样向有关对象发送消息,以完成所需的任务。

3、C与C++程序(类和对象的作用)

    1、C++对C的改进,最重要的就是增加了“类”这样一种类型。所以C++开始时被称为“带类的c”。
    2、C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。
    3、基于对象就是基于类。与面向过程的程序不同,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用了继承机制和多态性,就成为面向对象的程序设计。
    4、基于对象程序设计所面对的是一个个对象。所有的数据分别属于不同的对象。人们设想把相关的数据和操作放在一起,形成—个整体,与外界相对分隔。这就是面向对象的程序设计中的对象。

面向过程的结构化程序设计中:    程序=算法+数据结构

说明:
   
算法和数据结构两者是互相独立、分开设计的,面向过程的程序设计是以算法为主体的。

基于对象和面向对象程序设计中:

            对象=算法+数据结构
           
程序=(对象+对象+对象+…)+消息 或: 程序=对象s+消息
  
“对象s”表示多个对象。消息的作用就是对对象的控制。程序设计的关键是设计好每一个对象,以及确定向这些对象发出的命令,使各对象完成相应的操作。

4、面向对象的软件开发

   在以前软件开发所面临的问题比较简单,从任务分析到编写程序,再到程序的调试,难度都不太大,可以由一个人或一个小组来完成。随着软件规模的迅速增大,软件人员面临的问题十分复杂,需要考虑的因素很多,在—个软件中所产生的错误和隐藏的错误可能达到惊人的程度,这不是程序没计阶段所能解决的。需要规范整个软件开发过程,明确软件开发过程中每个阶段的任务,在保证前一个阶段工作的正确性的情况下,再进行下一阶段的工作。这就是软件工程学需要研究和解决的问题。 面向对象的软件工程包括以下几个部分:

⒈面向对象分析(object oriented analysis,OOA)
⒉面向对象设计(Object oriented design,OOD)
⒊面向对象编程(object oriented programming,OOP)
⒋面向对象测试(object oriented test,OOT)
⒌面向对象维护(Object oriented soft maintenance,OOSM)


二、类的声明和对象的定义

1、类的对象的关系(事物的抽象与抽象事物的实例)

对象(object)---每一个实体都可以作为对象。
类(class)---类代表了某一批对象的共性和特征。

1、类是对象的类型。
2、类是一批有共性和特征的对象
3、类是对象的抽象,而对象是类的实例。
4、类是对象的模板。
5、对象是类的一个变量。

2、声明类类型

   类是用户自己指定的类型。如果程序中要用到类类型,必须自己根据需要进行声明,或者使用别人已设计好的类。C++标准本身并不提供现成的类的名称、结构和内容。
   在C++中怎样声明一个类类型呢?其方法和声明一个结构体类型是相似的。

声明一个结构体类型的方法:

struct Student       //声明了一个名为Student的结构体类型
  
{  int num;
      char name[20];
      char sex
   };
Studentstudl,stud2; //定义了两个结构体变量studl和stud2

声明一个类类型的方法:

class Student       //以class开头
  
{ int num;
     char name[20];
     char sex;    //以上3行是数据成员
    
void display() //这是成员函数
      
{ tout<<"name:" <<name <<endl;
        cout <<"sex:" <<sex<<eadl; //以上4行是函数中的操作语句
     
}
   }
Studentsmdl,stud2; //定义两个Student类的对象studl和smd2


可以将上面类的声明改为

class Student  //声明类类型
  
{ private: //声明以下部分为私有的
     
int num;
      char name[20]
      char sex;
      public: //声明以下部分为公用的
     
void display()
         { cout<<"mum:"<<nurn<<etldl;
           cout<<"name:"<<name<<endl;
           cout<<"sex:"<<sex<<endl;}
   };
Student studl,stud2; //定义了两个Student类的对象现在声明了dlspllay函数是公用的,外界就可以调用该函数了。


归纳以上对类类型的声明,可以得到其一般形式如下:

class 类名
    { private:
        私有的数据和成员函数;
      public:
        公用的数据和成员函数;
    };

说明:
  
1、private和public称为成员访问限定符(member accesss pecifier)。
   2、除了pnvate和public之外,还有一种成员访问限定符protected(受保护的),用protected声明的成员称为受保护的成员,它不能被类外访问(这点与私有成员类似),但可以被派生类的成员函数访问。
   3、在声明类类型时,声明为private的成员和声明为public的成员的次序任意,在一个类体中不一定都包含private和public部分。在一个类体中,关键字pnvate和public可以分别出现多次,即一个类体可以包含多个private和public部分。
   4、在以前的C++程序中,常先出现private部分,后出现public部分。
   5、在C++程序中,经常可以看到类。常用的C++编译系统往往向用户提供类库(但不属于C++语言的组成部分),内装常用的基本的类,供用户使用。不少用户也把自己或本单位经常用到的类放在一个专门的类库中,需要用时直接调用,这样就减少了程序设计的工作量。

3、 定义对象的方法

定义对象也可以有几种方法。

⑴先声明类类型,然后再定义对象

Student studl,stud2; //Student是已经声明的类类型
应该说明,在C++中,在声明了类类型后,定义对象有两种形式。

   ①class类名对象名
      如class Student studl,stud2;
      把class和Student合起来作为一个类名,用来定义对象。
   ②类名对象名
      如Student studl,stud2;
   直接用类名定义对象。这两种方法是等效的。第1种方法是从C语言继承下来的,第2种方法是C++的特色,显然第2种方法更为简捷方便。

⑵在声明类类型的同时定义对象

class Student       //声明类类型
  
{ public:      //先声明公用部分
     
void display()
      { cout<<"num:"<<num<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"sex:"<<sex <<endl;
      }
     private:      //后声明私有部分
     
int num;
      char name[20];
      char sex;
   }studl,stud2; //定义了两个Student类的对象

⑶不出现类名,直接定义对象

class      //无类名
{  pnvate: //声明以下部分为私有的
  
public: //声明以下部分为公用的
}studl,stud2;//定义了两个无类名的类对象

说明:
  
1、直接定义对象,在C++中是合法的、允许的,但却很少用,也不提倡用。
   2、在定义一个对象时,编译系统会为这个对象分配存储空间,以存放对象中的成员。

4、类和结构体类型的异同

   C++增加了class类型后,仍保留了结构体类型(struct),而且把它的功能也扩展了。C++允许用struct来定义一个类类型。

说明:
  
1、这是由于C++语言在设计时所定下的一项原则:C++必须兼容C,使得大量过去用C编写的已在广泛使用的C程序能够不加修改地在C++的环境下使用。可以设想,如果C++是从零开始设计(而不是以C为基础),很有可能不会提供结构体这种数据类型,因为类类型已经包括了结构体类型的所有功能,而且功能更强,更符合面向对象程序设计的要求。
   2、为了使结构体类型也具有封装的特征,C++不是简单地继承C的结构体,而是使它也具有类的特点,以便于用于面向对象程序设计。用struct声明的结构体类型实际上也就是类。
   3、用struct声明的类和class声明的类是有区别的:用struct声明的类,如果对其成员不作pnvate或public的声明,系统将其默认为public(公用的)。如果想分别指定私有成员和公用成员,则应用private或public作显式声明。而用class定义的类,如果不作private或public声明,系统将其成员默认为private(私有的),在需要时也可以自己用显式声明改变。

请对比下面两个例子:

(1)struct Student        //以struct开头
     
{ int num;
        charname[20];
        char sex;      //以3行是数据成员
       
void display()   //这是成员函数
        
{  cout<<"num:"<<num<<endl;
            cout<<"name:"<<name<<endl;
            cout<<"sex:"<<SeX<<endl;}
         };


(2)class Student
     { int num;
      char name[20];
      char sex;     //以上3行是数据成员
     
void display()   //这是成员函数
       
{ cout<<"nunl:"<<hum<<endl;
         cout<<"name:”<<name<<endl;
         cout<<"sex:"<<sex<<endl; }
      };

 

 

 

 

 

转自:http://210.44.195.12/cgyy/text/HTML/text/04.htm

相关文章:

  • 第五讲:类的成员、对象成员的引用
  • Linux2.6内核--进程调度理论
  • 第六讲:类、对象的简单应用及类封装、隐蔽性
  • 第七讲:构造函数与析构函数
  • 第八讲:对象数组与指针
  • elk 日志处理的一点思路
  • 第九讲:共用数据的保护与对象的动态处理
  • rtems 4.11 IRQ (arm,beagle)
  • 第十讲:对象的赋值和复制
  • jQuery插件之ajaxFileUpload[转载]
  • 第十一讲:运算符重载与重载函数
  • Google Chrome Frame 自定义渲染方式,调用ActiveX
  • 第十二讲:重载单、双目、插入、提取运算符
  • 第十三讲:不同类型数据间的转换
  • 一)6张表
  • 【EOS】Cleos基础
  • avalon2.2的VM生成过程
  • css选择器
  • egg(89)--egg之redis的发布和订阅
  • GraphQL学习过程应该是这样的
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • laravel with 查询列表限制条数
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • maya建模与骨骼动画快速实现人工鱼
  • Python socket服务器端、客户端传送信息
  • SpiderData 2019年2月13日 DApp数据排行榜
  • vue 配置sass、scss全局变量
  • Vue2.0 实现互斥
  • Webpack 4 学习01(基础配置)
  • web标准化(下)
  • 包装类对象
  • 从输入URL到页面加载发生了什么
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 深度学习在携程攻略社区的应用
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信公众号开发小记——5.python微信红包
  • 新手搭建网站的主要流程
  • 由插件封装引出的一丢丢思考
  • 通过调用文摘列表API获取文摘
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #pragma data_seg 共享数据区(转)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (办公)springboot配置aop处理请求.
  • (二)Eureka服务搭建,服务注册,服务发现
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (三)Honghu Cloud云架构一定时调度平台
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)Sublime Text3配置Lua运行环境
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Remoting常用部署结构
  • .net 设置默认首页
  • .net 提取注释生成API文档 帮助文档
  • .net 怎么循环得到数组里的值_关于js数组