<> = C++面向对象程序设计 Object Oriented Programming in C++ = == C语言程序 == 写一个C语言程序,将所有输入的小写字母变大写字母、其它字母不变输出到屏幕上: {{{#!cplusplus #include char toupper(char c) { if(c >= 'a' && c <= 'A') return c + 'A' -'a'; else return c; } int main() { int c; while( (c = getchar()) != EOF) putchar(toupper(c)); } }}} == C语言的特点 == * C语言是结构化的程序设计语言,支持顺序、循环、分支结构 * C语言是命令式的程序设计语言,程序由一组函数和函数之间的互相调用组成 * 一般采用自顶向下的设计方法 缺点: * 难以对需要解决的问题进行抽象,转换成解决问题的程序 * 旧代码不易重用 * 软件不易维护,需求变化时,程序修改困难 == 程序设计语言的类型 == 所有程序设计语言都提供一定程度的抽象,提供不同的看待问题的观点。 * 汇编语言是机器语言的抽象,它要求程序员以计算机的结构去思考。 * 命令式程序设计把问题抽象成一组状态(变量)和改变状态的语句。 * 结构化程序设计语句的执行流程分为顺序、分支和循环三种。 * 过程式程序设计把问题抽象成一组函数和函数之间的相互调用。 * 函数式程序设计则把问题看成是数学函数的求解,而没有状态和语句。 * 面向对象程序设计把所有的事物都抽象成一组对象和对象之间的交互。 * 泛型编程把问题抽象成与类型无关的泛型算法 还有逻辑编程、AOP等等。 == 面向对象程序设计基本原理 == * 传统过程式语言要求程序员按计算机的结构去思考,而不是按要解决的问题的结构去思考。 * 面向对象程序设计的思路和人们日常生活中处理问题的思路相似 * 一个复杂的事物总是有很多部分组成的,比如一辆汽车由发动机、底盘、车身、轮子等等部件组成。 * 人们操作事物的接口而不用关心其构造,比如开车的人只用关心方向盘、油门、刹车等汽车所提供的操作接口。 * 基本概念 * 对象:任何事物都是对象 * 属性:对象的静态特征 * 行为:对象的动态特征 * 消息:指示对象作出某种行为 * 封装:把对象内部实现和操作接口分开 * 抽象:对各种对象进行分类 * 继承:分类的层次结构 * 多态:对于不同类型的对象,可以对同一个消息作出不同的反应。 == 面向对象的三个特点 == * 封装:构造软件集成块 * 所有的东西都是“对象” * 对具体对象进行概括,描述其公共性质,抽象成“类” * 同类的不同对象“属性”不同 * 同类对象具有相同的“方法” * 对象是“属性”和“方法”相结合的整体 * 对象是“数据”和“算法”相结合的整体 * 只留接口,隐藏实现 * 继承:扩展已有集成块 * 类与类之间Is-a的关系 * 重用共同的东西 * 增加接口,实现独特的东西 * 多态:同样的操作,不同的结果 * 相同的方法,作用在不同类型的对象上,产生不同的结果 * 用相同的方法操纵不同的对象 == 面向对象程序设计的作用 == * 更多模块化单位,更好的组织程序 * 更容易重用旧代码 * 有更多更好的程序库 * 更容易应付需求变化 总之:得到更高的软件开发效率 == 计算机语言的发展 == * 机器语言 由01构成的机器指令 * 汇编语言 用符号代替机器指令帮助记忆,与机器指令一一对应 * 高级语言 与人类思维方式更接近,与底层无关 == 程序设计范式 == * 无范式:最初的ForTran,最初的BASIC等早期高级语言 * 结构化程序设计Structured Programming:PASCAL,C等 * 函数式程序设计Functional Programming:Lisp, Scheme, Haskell等 * 面向对象程序设计Object Oriented Programming:SmallTalk, Java, C#等 * 泛型程序设计General Programming:C++, Java1.5等 * 其他范式:AOP, DbC等 == 程序执行方式 == * 编译型:由编译器翻译成机器指令执行,比如C, FORTRAN等 * 解释型:由解释器逐条解释执行,比如BASIC, LISP等 * 混合型:由编译器翻译成中间代码,再由解释器逐条执行中间代码,比如Java, .net等 == 为什么选择C++ == * C++兼容C语言 * C语言的程序员多 * C语言的源代码多 * 有C语言基础,较容易学习 * C++是通用的语言,在各种领域都可以使用 * 桌面应用(Office, Photoshop, IE) * 服务器程序(Apache, IIS, ...) * 数据库系统(SQL Server, Oracle, ...) * 操作系统(Windows, ...) * 编译器(GCC, Microsoft C++, Borland C++, ...) * 嵌入式系统(VxWorks, Symbian OS, ...) * 游戏(Doom, Quake, Halflife, ...) * 科学计算 * 支持多种程序设计范式 * 支持兼容C语言的结构化程序设计 * 支持基于对象的程序设计 * 支持面向对象程序设计 * 支持泛型程序设计 * 运行效率很高 * 与C语言相比,运行效率±10% * 开发效率比较高 * 有大量的C/C++库可以使用,提高了开发效率 * wxWindows, QT, gtk+, MFC, boost, MTL, VXL, ACE, …… * 跨平台较好 * 支持源码级跨平台 * 各种软件硬件平台均可使用(Windows、Linux、Unix、Solaris、MacOS、AIX……) * 支持各种硬件平台(x86、x86_64、ia64、alpha、arm、sparc、powerpc、m68k、mips) * 标准开放,不为某个商业公司所有 * 缺点:非常复杂,较难学 == C++语言的发展历史 == * 80年代初贝尔实验室开始研究,主要作者是Bjarne Stroustrup * 1983年第一个C++诞生 * 1985年The C++ Programming Language完成 * 1990年加入模板和异常特性 * 1990年The Annotated C++ Reference Manual完成 * 1993年加入名字空间和运行时类型特征 * 1998年C++标准完成 == C++开发环境 == * 编辑器——编辑源代码 * 编译器——将源代码变成可执行程序 * 调试器——消除程序中的错误 == 常用集成开发环境 == * vi/emacs + gcc + gdb (Unix平台通用,免费) * Visual C++ 6/2003/2005(Windows下最好,价格昂贵,调试方便) * netbeans(跨平台,免费,支持多语言,用java写成,运行速度较慢) * Eclipse + CDT(跨平台,免费,支持多语言,用java写成,运行速度慢) * Dev-C++(Windows平台,免费,小巧,调试不方便) == C++程序开发流程 == * 分析设计Analyze and Design(需求,设计) * 编码Code(得到c++源程序) * 编译Compile(生成obj) * 连接Link(生成可执行文件) * 调试运行Debug * 发布Deploy == 课程要求 == * 掌握面向对象程序设计(OOP)的思想和方法 * 封装Encapsulation, Abstraction * 继承Inheritance * 多态Polymorphism * 掌握用C++进行面向对象程序设计 * 改进的C语言——实现更好的面向过程设计 * 类class——实现封装、继承、多态的基础 * 继承——实现多态的基础 * 虚函数virtual function——实现多态的唯一手段 * 运算符重载operator overload——实现自定义类型的途径 == 课时 == * 面向对象与C++概述 * 改进的C语言 * 类 * 继承 * 多态 * 运算符重载 * 输入输出流 * 标准模板库 == 基础知识 == * C语言程序设计是必须的 * 基本类型、运算符、表达式 * 控制结构 * 函数 * 数组、指针 * 结构体 * 输入输出库 * 其他程序设计语言也是有帮助的(Java、C#、Delphi、Python等) == 参考书 == * 《Essential C++中文版》,Stanley Lippman * 《C++编程思想》第二版,Bruce Eckel * 《C++ Primer中文版》,Stanley Lippman * 《The C++ Programming Language Special 3rd Edition》,Bjarne Stroustrup * 《The C Programming Language第二版》,K&R == 如何学习C++和面向对象编程 == * 多看书(需要多看参考书) * 上机编程(实验、大作业) * 讨论(与同学老师讨论,在网上论坛、讨论组讨论) ------ CategoryCpp