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
C++-怎样写程序(面向对象)的更多相关文章
- 用CIL写程序:定义一个叫“慕容小匹夫”的类
前文回顾: <用CIL写程序:你好,沃尔德> <用CIL写程序:写个函数做加法> 前言: 今天是乙未羊年的第一天,小匹夫先在这里给各位看官拜个年了.不知道各位看官是否和匹夫一样 ...
- 用CIL写程序:从“call vs callvirt”看方法调用
前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...
- 用C++写程序的一些感悟
前言 近期使用C++有了一些心得很感悟,这里整理一下. 心得1 如果只会使用LabVIEW写程序,还想要进一步深入程序设计,一定要学习一门文本语言. 什么是会用LabVIEW 会用是个比较笼统的概念. ...
- 用CIL写程序:写个函数做加法
前言: 上一篇文章小匹夫为CIL正名的篇幅比较多,反而忽略了写那篇文章初衷--即通过写CIL代码来熟悉它,了解它.那么既然有上一篇文章做基础(炮灰),想必各位对CIL的存在也就释然了,兴许也燃起了一点 ...
- 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 ...
- 第一章-第四题(ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么?软件工程是不是教那些不怎么会写程序的人开发软件? 你怎么看?这个游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素呢?有没有考虑到)--By梁旭晖
引用 http://baike.baidu.com/link?url=z_phkcEO4_HjFG_Lt163dGFAubdb68IbfcfzWscTOrrZ55WbJEQKzyMQ5eMQKyatD ...
- 4.“写程序” 这个活动大多数情况下是个人行为。 我们听说的优秀程序员似乎都是单打独斗地完成任务。同学们在大学里也认识一些参加ACM 比赛的编程牛人, 他们写的ACM 比赛的程序是软件么? “写程序” 和 ”做软件“ 有区别么? 请采访这些学生。
ACM的题库的编程都只能算做程序,不能算软件.写程序和做软件区别还是很大的.程序是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合.为实现预期目的而进行操作的一系列语句和指令.而软件是程 ...
- IntelliJ下使用Code/Live Template加快编码速度:程序员的工作不是写程序,而是写程序解决问题
程序员的工作不是写程序,而是写程序解决问题. --- 某不知名程序员 我们每天都在写代码,有些代码有结构性的相似,但不是所有的代码都可以被抽成方法.在这种情况下,我们应该考虑使用template的方式 ...
- object-c cocos2d-x 写程序时注意调试的技巧
(1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...
随机推荐
- 13 年的 Bug 调试经验总结 【转载】
在<Learning From Your Bugs>一文中,我写了关于我是如何追踪我所遇到的一些最有趣的bug.最近,我回顾了我所有的194个条目(从13岁开始),看看有什么经验教训是我可 ...
- 破局AI落地难,数据标注行业需率先变革丨曼孚科技
2019年,国内人工智能领域的投融资热情大幅降低,相当数量的AI企业彻底消失在了历史的长河中,“人工智能寒潮已至”甚至成为行业年度热词. 与前几年创业与投资热情齐头并进的盛况相比,近段时间的AI行业 ...
- netty 的事件驱动
netty 是事件驱动的,这里面有两个含义,一是 netty 接收到 socket 数据后,会产生事件,事件在 pipeline 上传播,二是事件由特定的线程池处理. NioEventLoop 轮询网 ...
- magento2.2.3 根据产品ID获取栏目名称的正确调用方式
根据product_id 获取 category_ids : /** * @param $product_id * @return array */ public function mc_getCat ...
- Java-算式填符号
题目: 某批警察叔叔正在进行智力训练:1 2 3 4 5 6 7 8 9 = 110 请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号).之间没有填入符号的数 ...
- 2-1.了解Pod对象
1.Pod参数定义 # 必填,版本号 apiVersion: string kind: Pod # 必填,元数据 metadata: # 必填,Pod对象的名称(命名规范需要符合RFC 1035规范) ...
- idea 代码没有被svn控制
背景 开发从svn上拉下来的代码,上传时发现idea的快捷键(ctrl+T)没反应以及菜单栏中没有相关按钮. 原因 发现项目当前文件夹里没有 .svn 隐藏文件夹,所以当前文件夹就没有被idea识别继 ...
- Oracle中表与包体用户没有操作权限问题
一.表1.在stg用户下查看table_name 表是否存在select * from table_name 2 在表所在用户执行(授权)grant select,update on table_na ...
- P1462 通往奥格瑞玛的道路【二分+Dij】
P1462 通往奥格瑞玛的道路 提交 29.89k 通过 6.88k 时间限制 1.00s 内存限制 125.00MB 题目提供者gconeice 难度提高+/省选- 历史分数100 提交记录 查看题 ...
- H5_0018:z-index失效的原因
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效. 在CSS中,只能通过代码改变层级,这个属性就是z-index, 要让z-index起作用有个小小前提,就是元素的p ...