• C++-怎样写程序(面向对象)


      使用编程语言写好程序是有技巧的。

      主要编程技术:

      1. 编程风格

      2. 算法

      3. 数据结构

      4. 设计模式

      5. 开发方法

      编程风格指的是编程的细节,比如变量名的选择方法、函数的写法等。

      算法是解决问题的方法。现实中各种算法都已经广为人知了,所以编程时的算法也就是对这些技巧的具体应用。有很多算法,如果单靠自己去想是很难想出来的。比方说数组的排序就有很多的算法,如果我们对这些算法根本就不了解,那么要想做出高速排序程序会很困难。算法和特定的数据结构关系很大。

      所以有一位计算机先驱曾经说过:“程序就是算法加数据结构。”

      设计模式是指设计软件时,根据以前的设计经验对设计方法进行分类。算法和数据结构从 广义上来说也是设计模式的一种分类。有名的分类(设计模式)有23种(《《设计模式:可复用面向对象软件的基础》》)。

      开发方法是指开发程序时的设计方法,指包括项目管理在内的整个程序开发工程。小的软件项目可能不是很明显,在大的软件项目中,随着开发人员的增加,整个软件工程的开发方法 就很重要。

      面向对象的编程方法

      下面,我们来看看Ruby的基本原理——面向对象的设计方法。面向对象的设计方法是20世纪60年代后期,在诞生于瑞典的Simula编程语言中最早开始使用的。Simula作为一种模拟语言,对于模拟的物体,引入了对象这种概念。比如说对于交通系统的模拟,车和信号就变成了对象。一辆辆车和一个个信号就是一个个对象,而用来 定义这些车和信号的,就是类

      如今,面向对象的设计思想已经相当重要且深入人心了,以后它的地位和重要性也应该不会降低。所以在学习编程语言时,对面向对象设计思想的理解就非常重要。

      但是,很多程序员觉得面向对象的设计思想很难,不容易理解,那么它的难点在何处?

      面向对象的难点

      面向对象的难点在于,虽然有关于面向对象的说明和例子,但是面向对象具体的实现方法却不是很明确。

      面向对象这个词本身是很抽象的,越抽象的东西,人们就越难理解。并且对于面向对象这个概念,如果没有严密的定义,不同的人就会有不同的理解。

      我认为面向对象编程语言中最重要的技术是“多态性”。我们就先从多态性说起吧。

      多态性

      多态性,英文是polymorphism,其中词头poly-表示复数,morph表示形态,加上词尾-ism,就是复数形态的意思,我们称它为多态性。

      换个说法,多态就是可以把不同种类的东西当做相同的东西来处理

      只从字面上分析不容易理解,举例说明一下。

      看看图2-1所示的3个箱子。每个箱子都有不同的盖子。一个是一般的盖子,一个是带锁的盖子,一个是带有彩带的盖子。因为箱子本身非常昂贵,所以每个箱子都有专人管理,如果要从箱子里取东西,要由管理人员去做。

      

      操作对象是三个箱子,分别是盖着盖子的箱子、加了锁的箱子、系了彩带的箱子

      打开3个箱子的方法都不同,但如果发出同样的打开箱子的命令,3个人会用自己的方法来打开自己的箱子。因此,3个箱子虽然各有不同,但它们同样“都是箱子,可以打开盖子”。这就是多态性的本质。

      在编程中,“打开箱子”的命令,我们称之为消息;而打开不同箱子的具体操作,我们称之为方法

      在C++中,当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

      下面的实例中,基类 Shape 被派生为两个类,如下所示:

    #include <iostream> 
    using namespace std;
     
    class Shape {
       protected:
          int width, height;
       public:
          Shape( int a=0, int b=0)
          {
             width = a;
             height = b;
          }
          int area()
          {
             cout << "Parent class area :" <<endl;
             return 0;
          }
    };
    class Rectangle: public Shape{
       public:
          Rectangle( int a=0, int b=0):Shape(a, b) { }
          int area ()
          { 
             cout << "Rectangle class area :" <<endl;
             return (width * height); 
          }
    };
    class Triangle: public Shape{
       public:
          Triangle( int a=0, int b=0):Shape(a, b) { }
          int area ()
          { 
             cout << "Triangle class area :" <<endl;
             return (width * height / 2); 
          }
    };
    // 程序的主函数
    int main( )
    {
       Shape *shape;
       Rectangle rec(10,7);
       Triangle  tri(10,5);
     
       // 存储矩形的地址
       shape = &rec;
       // 调用矩形的求面积函数 area
       shape->area();
     
       // 存储三角形的地址
       shape = &tri;
       // 调用三角形的求面积函数 area
       shape->area();
       
       return 0;
    }
    

      当上面的代码被编译和执行时,它会产生下列结果:

    Parent class area
    Parent class area

      导致错误输出的原因是,调用函数 area() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 area() 函数在程序编译期间就已经设置好了。

      但现在,让我们对程序稍作修改,在 Shape 类中,area() 的声明前放置关键字 virtual,如下所示:

    class Shape {
       protected:
          int width, height;
       public:
          Shape( int a=0, int b=0)
          {
             width = a;
             height = b;
          }
          virtual int area()
          {
             cout << "Parent class area :" <<endl;
             return 0;
          }
    };
    

      修改后,当编译和执行前面的实例代码时,它会产生以下结果:

    Rectangle class area
    Triangle class area

      此时,编译器看的是指针的内容,而不是它的类型。因此,由于 tri 和 rec 类的对象的地址存储在 *shape 中,所以会调用各自的 area() 函数。

      正如您所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的

      多态性的优点

      前面说明了多态性,那么它到底有什么好处呢?
      首先,各种数据可以统一地处理。多态性可以让程序只关注要处理什么(What)而不是怎么去处理(How)
      其次,是根据对象的不同自动选择最合适的方法,而程序内部则不发生冲突。不管调用有锁的箱子,还是系着彩带的箱子,它们都能自动处理,不用担心调用中会发生错误,这样就会减轻程序员的负担。
      再次,如果有新数据需要对应处理的话,通过简单的追加就可以实现了,而不需要改动以前的程序,这就让程序具备了扩展性
    综上所述,多态性提高了开发效率,所以说,面向对象技术最重要的一个概念应该是多态性。

      多态性、数据抽象和继承被称为面向对象编程的三原则。这三项原则通常也会有别的称谓。

      例如,把多态性称为动态绑定,把数据抽象称为信息隐藏或封装,虽然名称不同,但是内容都是相同的。许多人认为这些原则是面向对象程序设计的重要原则。

      后面我们再谈数据抽象和继承。拜拜!

    参考文献:

      松本幸弘的程序世界

      菜鸟教程:http://www.runoob.com/cplusplus/cpp-polymorphism.html

  • 相关阅读:
    Java内置包装类
    for循环思路题
    常用函数
    函数
    冒泡排序
    数组的运用
    for循环中有意思的练习题。
    for循环
    运算中容易出现的错误
    分支的运用
  • 原文地址:https://www.cnblogs.com/lemaden/p/10152467.html
Copyright © 2020-2023  润新知