第十一章 面向对象的程序设计思想 OOP

组别:提高级&NOI
难度:6

面向对象的程序设计思想(Object-oriented programming)对与面向过程的程序设计思想(procedure-oriented programming)相对应。

不支持面向对象的编程语言:C、Pascal、Fortran
支持面向对象的编程语言:C++、 java、C#、 Python、PHP、 Perl等

形象的比喻,面向过程就是雕版印刷,而面向对象就是活字印刷。

一、类(class)

类是面向对象程序设计的核心,其实际上可以被看成是一种新的数据类型,也是实现抽象类型的基础。前面已经讲过,类是对某一类对象的抽象;而对象是某一种类的实例,因此类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。C++中的类是一种复杂的数据类型,其是将不同类型的数据和与这些数据相关的操作封装在一起的集合体。类是一种用户定义的类型,C++语言中提供了类这种工具使得实际生活中应用的对象在程序中可以直接被表示为一个标识符,并可以对其进行引用和操作。属性是由类中的数据成员来表示的,而操作由类中的成员函数来表示。

下面两个程序分别用结构体和类实现同样的功能。

问题:如何把一只大象放到冰箱里?
1、测量大象体积是否比冰箱小
2、打包大象
3、开冰箱门
4、放入大象
5、关上冰箱门。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
using namespace std;

struct fridge{
int volume;
};

struct elephant{
int size;
};

float  getElephantSize(){     //获取体积
         float elephantSize;
         cout<<"please input the size of elephant:";
         cin>>elephantSize;
         return elephantSize;
   }
   float  getFridgeSize(){     //获取体积
         float FridgeSize;
         cout<<"please input the size of fridge: ";
         cin>>FridgeSize;
         return FridgeSize;
   }

void packUp(){   
    cout<<"pack up elephant into fridge!";
   }

  void open(){  //打开冰箱门
     cout<<"open the door of fridge\n";
    }
 bool putElephant(elephant *e,fridge *f){
        e->size=getElephantSize();
       f->volume=getFridgeSize();
      
        if((e->size)<=(f->volume))return true;
        else return false;
    }
   void close(){
      cout<<"close the door of fridge.";
   }

int main(){

        struct elephant e1;
        struct fridge f1;
        open();
       if(putElephant(&e1,&f1)){
        packUp();
        close();
        }
       else cout<<"don't input the elephant into fridge";
      
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
using namespace std;
class Elephant{
public:
float  getElephantSize(){     //获取体积
                 cout<<"please input the size of elephant:";
         cin>>size;
         return size;
   }

private:
    int size;
};

class Fridge{
public:
  void open(){  //打开冰箱门
     cout<<"open the door of fridge\n";
    }
    float  getFridgeSize(){     //获取体积
           cout<<"please input the size of fridge: ";
         cin>>volume;
         return volume;
   }
   bool putElephant(float e, float f){
              
        if((e<=f))return true;
        else return false;
    }
 
void packUp(){   
    cout<<"pack up elephant into fridge!";
   }
   
   void close(){
      cout<<"close the door of fridge.";
   }
  private:
    int volume;//容积
    
   };

int main(){

         Elephant e1;
         Fridge f1;
      
       if(f1.putElephant(e1.getElephantSize(),f1.getFridgeSize())){
        f1.packUp();
        f1.close();
        }
       else cout<<"can't input the elephant into fridge";
      
}

二、面向对象的程序设计思想Object-oriented programming

在传统的面向过程的程序设计中,程序的表示方法为:程序=算法+数据结构。

在面向对象程序设计中,程序的表示方法为:
对象=算法+数据结构
程序=对象+对象+对象+…… 


三、继承、封装、多态

1、封装性:

封装是指将一个计算机系统中的数据以及与这个数据相关的一切操作语言(即描述每一个对象的属性以及其行为的程序代码)组装到一起,一并封装在一个有机的实体中,把它们封装在一个“模块”中,也就是一个类中,为软件结构的相关部件所具有的模块性提供良好的基础。在面向对象技术的相关原理以及程序语言中,封装的最基本单位是对象,而使得软件结构的相关部件的实现“高内聚、低耦合”的“最佳状态”便是面向对象技术的封装性所需要实现的最基本的目标。对于用户来说,对象是如何对各种行为进行操作、运行、实现等细节是不需要刨根问底了解清楚的,用户只需要通过封装外的通道对计算机进行相关方面的操作即可。大大地简化了操作的步骤,使用户使用起计算机来更加高效、更加得心应手。

2、继承性:

继承性是面向对象技术中的另外一个重要特点,其主要指的是两种或者两种以上的类之间的联系与区别。继承,顾名思义,是后者延续前者的某些方面的特点,而在面向对象技术则是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。如果按照继承源进行划分,则可以分为单继承(一个对象仅仅从另外一个对象中继承其相应的特点)与多继承(一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象);如果从继承中包含的内容进行划分,则继承可以分为四类,分别为取代继承(一个对象在继承另一个对象的能力与特点之后将父对象进行取代)、包含继承(一个对象在将另一个对象的能力与特点进行完全的继承之后,又继承了其他对象所包含的相应内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了对于父对象的包含)、受限继承、特化继承。

3、多态性:

从宏观的角度来讲,多态性是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;从微观的角度来讲,多态性是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所表示的函数是不同的。


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
using namespace std;

class Animals{
public:
    float  getAnimalSize(){     //获取体积
         cout<<"please input the size of Animal:";
         cin>>size;
         return size;
    }

private:
    int weight;
    int size;
};

class Elephant:public Animals{
     public:
        float getElephantNoselength(){ 
          cout<<"please intput the length of elephant nose ";
          cin>>noseLength;
          return noseLength;
        }
     private:
     float noseLength;
};

class Fridge{
public:
  void open(){  //打开冰箱门
     cout<<"open the door of fridge\n";
    }
    float  getFridgeSize(){     //获取体积
         cout<<"please input the size of fridge: ";
         cin>>volume;
         return volume;
   }
   bool putAnimal(float e, float f){
        if((e<=f))return true;
        else return false;
    }
 
void packUp(){   
    cout<<"pack up animal into fridge!";
   }
 
   void close(){
      cout<<"close the door of fridge.\n";
   }
  private:
    int volume;//容积
   };

int main(){
         Elephant e1;
         Fridge f1;
       if(f1.putAnimal(e1.getAnimalSize(),f1.getFridgeSize())){
        f1.packUp();
        f1.close();
        }
       else cout<<"can't input the elephant into fridge";
       cout<<e1.getElephantNoselength();
      
}
Scroll to Top