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

  主要编程技术:

  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

C++-怎样写程序(面向对象)的更多相关文章

  1. 用CIL写程序:定义一个叫“慕容小匹夫”的类

    前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...

  2. 用CIL写程序:从“call vs callvirt”看方法调用

    前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...

  3. 用C++写程序的一些感悟

    前言 近期使用C++有了一些心得很感悟,这里整理一下. 心得1 如果只会使用LabVIEW写程序,还想要进一步深入程序设计,一定要学习一门文本语言. 什么是会用LabVIEW 会用是个比较笼统的概念. ...

  4. 用CIL写程序:写个函数做加法

    前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...

  5. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  6. 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖

    引用 http://baike.baidu.com/link?url=z_phkcEO4_HjFG_Lt163dGFAubdb68IbfcfzWscTOrrZ55WbJEQKzyMQ5eMQKyatD ...

  7. 4.“写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。

    ACM的题库的编程都只能算做程序,不能算软件.写程序和做软件区别还是很大的.程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行操作的一系列语句和指令.而软件是程 ...

  8. IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题

    程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...

  9. object-c cocos2d-x 写程序时注意调试的技巧

    (1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...

随机推荐

  1. Windows通过DOS命令行设置IP地址

    @rem 设置固定IP地址netsh interface ip set address "本地连接" static 192.168.1.200 255.255.255.0 192. ...

  2. 【python基础语法】字符串常用方法 、列表(第3天课堂笔记)

    """ 字符串的方法 join 字符串拼接,将列表转换为字符串 find 查找元素位置 count 查找元素个数 replace 替换字符 split 字符串分割,将字符 ...

  3. ural 2124

    题意 ural 做法 求出一个原根\(\omega\),对于每个数\(x\)写成\(x=\omega^{k}\)的形式,\(\delta(x)=\frac{p-1}{k}\) 我们不关心群具体的东西, ...

  4. 电脑和手机上常用apk或Pc软件的重要目录或文件或文件夹路径

    常用apk或Pc软件的重要目录或文件或文件夹路径 01.hosts文件位置在哪里 C:\Windows\System32\drivers\etc 02.Windows7的锁屏壁纸目录在哪 C:\Win ...

  5. spring boot的一些常用注解

    spring boot的一些常用注解: 使用@SpringBootApplication注释: 许多Spring Boot开发人员喜欢他们的应用程序使用自动配置,组件扫描,并能够在其“应用程序类”上定 ...

  6. 2020 kali linux 4 安装搜狗输入法

    kali linux 安装搜狗输入法之坑! 官方源: deb http://http.kali.org/kali kali-rolling main non-free contrib 国内源: deb ...

  7. Navigation Nightmare POJ - 1984 带权并查集

    #include<iostream> #include<cmath> #include<algorithm> using namespace std; ; // 东 ...

  8. webpack, autoprefixer

    可以通过postcss-loader 添加 const autoprefixer = require('autoprefixer'); ... { loader: 'postcss-loader', ...

  9. mysql 服务

    1.以管理员身份运行cmd:C:\Windows\System32\cmd.exe  右键以管理员身份运行 2.“具体路径” --install   “D:\programme installatio ...

  10. CodeForces 1144B

    原题https://vjudge.net/problem/CodeForces-1144B #include<bits/stdc++.h> using namespace std; vec ...