Visual c 第3章面向对象程序设计与C++语言 Windows编程采用的是面向对象的方法( Objec Oriented Programming,简称OOP)。面向对象软 件开发的方法是吸收了软件工程领域中有益概念和有效的方法,而发展起来的一种软件开发方法。它 集抽象性、封装性、继承性和多态性于一体,可以帮助人们开发岀模块化、数据抽象程度高的、体现 信息隐蔽、可复用、易修改、易扩大等特性的程序。 Visual c++是 Windows环境下最主要的C++开发环境,它支持面向对象编程,并提供可视化编程 环境。要使用 Visual c++进行程序开发,有必要了解面向对象的基本概念和掌握C++语言。本章首先 简要介绍面向对象的基本概念,而后对C++语言的基础及要点作简单的介绍。 3.1面向对象程序设计概述 面向对象的程序的最根本的目的就是使程序员更好地理解和管理庞大而复杂的程序,它在结构化程序 设计的基础上完成进一步的抽象。这种在设计方法上更高层次的抽象正是为了适应目前软件开发的特点。3 3.1.1面向对象的基本概念 实际上,面向对象的技术不只是一种程序设计方法,而是建立客观事务模型,分析复杂事务的思 想方法。本节将简要介绍一下与面向对象相关的基本概念 1.对象、类、实体 面向对象的程序是由若干“对象”有机结合而成。对象是面向对象的程序设计中最基本的概念 般意义上的对象指的是一个实体的实例,确切地说,面向对象的方法中的对象就是现实世界中某个 具体的物理实体在计算机逻辑中的映射和体现 而现实世界的实体(如自行车),在计算机世界表达为 计算机世界 现实世界 客观世界 个计算机可理解、可操纵、具有一定属性和行为的对象 而类则可以理解为对同种对象的集合与抽象。类和对象 的关系,就如同整数与1、2、3的关系一样,即对象是类的 实例化。可以理解为类是一个抽象的框架,类中的变量赋了 实 值就是对象。类、对象与实体的关系可表示为如图3.1所示 主观世界 面向对象的程序是由若干“对象”有机结合而成。这些 对象可以互相通讯、协调和配合,从而共同完成整个程序的 抽象 任务和功能 2.对象的属性 3.1类、对象与实体的关系 面向对象的方法中,一个对象具有状态、行为和标识三方面特性 对象的状态也称为对象的静态属性,包括对象内部包含的各种信息—一变量,这些变量的值标明 励志照亮人生编程改变命运
46 励志照亮人生 编程改变命运 零基础学 Visual C++ 第3 章 面向对象程序设计与C++语言 Windows编程采用的是面向对象的方法(Objec Oriented Programming,简称OOP)。面向对象软 件开发的方法是吸收了软件工程领域中有益概念和有效的方法,而发展起来的一种软件开发方法。它 集抽象性、封装性、继承性和多态性于一体,可以帮助人们开发出模块化、数据抽象程度高的、体现 信息隐蔽、可复用、易修改、易扩大等特性的程序。 Visual C++是Windows环境下最主要的C++开发环境,它支持面向对象编程,并提供可视化编程 环境。要使用Visual C++进行程序开发,有必要了解面向对象的基本概念和掌握C++语言。本章首先 简要介绍面向对象的基本概念,而后对C++语言的基础及要点作简单的介绍。 3.1 面向对象程序设计概述 面向对象的程序的最根本的目的就是使程序员更好地理解和管理庞大而复杂的程序,它在结构化程序 设计的基础上完成进一步的抽象。这种在设计方法上更高层次的抽象正是为了适应目前软件开发的特点。3 3.1.1 面向对象的基本概念 实际上,面向对象的技术不只是一种程序设计方法,而是建立客观事务模型,分析复杂事务的思 想方法。本节将简要介绍一下与面向对象相关的基本概念。 1. 对象、类、实体 面向对象的程序是由若干“对象”有机结合而成。对象是面向对象的程序设计中最基本的概念, 一般意义上的对象指的是一个实体的实例,确切地说,面向对象的方法中的对象就是现实世界中某个 具体的物理实体在计算机逻辑中的映射和体现。 而现实世界的实体(如自行车),在计算机世界表达为一 个计算机可理解、可操纵、具有一定属性和行为的对象。 而类则可以理解为对同种对象的集合与抽象。类和对象 的关系,就如同整数与1、2、3的关系一样,即对象是类的 实例化。可以理解为类是一个抽象的框架,类中的变量赋了 值就是对象。类、对象与实体的关系可表示为如图3.1所示。 面向对象的程序是由若干“对象”有机结合而成。这些 对象可以互相通讯、协调和配合,从而共同完成整个程序的 任务和功能。 2. 对象的属性 面向对象的方法中,一个对象具有状态、行为和标识三方面特性。 对象的状态也称为对象的静态属性,包括对象内部包含的各种信息—变量,这些变量的值标明 图3.1 类、对象与实体的关系 计算机世界 现实世界 客观世界 主观 世界 抽象 对象 实体 类 抽象 类别 抽 象 实 例 化 映射 映射
第4章面向对象程序设计与C++ 了对象所处的状态。当对象通过某种操作改变了状态,也就体现在它的属性变量的值的改变。对象的 行为也称对象的操作方法一对象的动态属性,其作用是设置或改变对象的状态。对象的标识则用于 区分不同的对象 简单地说,对象包含了数据和方法(在C++中,方法叫作类的成员函数),每个对象就是一个微小 的程序。由于其他对象不能直接操纵该对象的私有数据,只有对象本身的方法才能得到它,因而对象 具有很强的独立性,可把对象当作软件的基本组件,就像电器中的电子元件一样。对象的这种软件组 件作用使它具有很强的可重用性。而且增强了程序的可靠性和可维护性。 3.消息 面向对象的程序设计中,通过“消息”来请求对象进行动作,对象间的联系也是通过消息 ( Message)来完成的。消息中只包括了消息发送者的要求,不指示接收者具体该如何处理这些消息 个对象可以接收不同形式、不同内容的消息:相同的消息可以传送给不同的对象:不同的对象 对同样的消息可以作出不同的反映。有关 Windows的消息机制在第3章已经详细介绍了 4.类的组织结构 类是对具有公共的方法和一般特性的一组基本相同对象的描述,在面向对象的方法中,对象是构 成程序的基本单位,每个对象都应该属于某一类,就象传统程序设计中的变量,每个变量都应有一定 的类型。 在程序执行过程中,由类动态生成相应地对象,一个类可以生成多个不同的对象,这些对象具有 相同的属性。因此,对象也称为类的实例( Instance)。一个类可以由其他的类派生出来,类与类之间 根据具体情况以层次结构组织起来。处于上层的类称为父类,处于下层的类称为子类或派生类。 采用面向对象的方法来进行 Windows程序设计还可以简化对资源的管理。将资源映射成一个C++ 对象时,对资源的使用可以翻译成以下C++顺序 口创建一个对象:如定义一个画笔对象。 口使用对象:用画笔绘图 口撤销该对象 个对象的创建是对一个对象的定义过程,可以由对象的构造函数处理对资源的请求过程。当某 个对象退出活动范围时,它的撤销可以由编译器来自动管理 3.1.2面向对象技术的基本特征 到目前为止,对面向对象的概念的定义仍有不同的认识,但它的几个基本特征,如封装性、继承 性、多态性等,基本上得到认可。 1.封装性 封装就是把对象的属性和方法结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。封装 使对象形成两个部分:接口和实现。对于用户来说,接口是可见的,实现是不可见的。同样形式的接 口,其实现可能不同。好比取款机都有相同的取钱接口,但是不同的取款机实现这种取钱的接口方法 封装提供了两种保护:其一是保护对象,防止用户误用对象内部的属性和方法:其二是保护客户 端,即实现过程的改变不影响到接口,从而减小对客户端的不利影响。 励志照亮人生编程改变命
了对象所处的状态。当对象通过某种操作改变了状态,也就体现在它的属性变量的值的改变。对象的 行为也称对象的操作方法—对象的动态属性,其作用是设置或改变对象的状态。对象的标识则用于 区分不同的对象。 简单地说,对象包含了数据和方法(在C++中,方法叫作类的成员函数),每个对象就是一个微小 的程序。由于其他对象不能直接操纵该对象的私有数据,只有对象本身的方法才能得到它,因而对象 具有很强的独立性,可把对象当作软件的基本组件,就像电器中的电子元件一样。对象的这种软件组 件作用使它具有很强的可重用性。而且增强了程序的可靠性和可维护性。 3. 消息 面向对象的程序设计中,通过“消息”来请求对象进行动作,对象间的联系也是通过消息 (Message)来完成的。消息中只包括了消息发送者的要求,不指示接收者具体该如何处理这些消息。 一个对象可以接收不同形式、不同内容的消息;相同的消息可以传送给不同的对象;不同的对象 对同样的消息可以作出不同的反映。有关Windows的消息机制在第3章已经详细介绍了。 4. 类的组织结构 类是对具有公共的方法和一般特性的一组基本相同对象的描述,在面向对象的方法中,对象是构 成程序的基本单位,每个对象都应该属于某一类,就象传统程序设计中的变量,每个变量都应有一定 的类型。 在程序执行过程中,由类动态生成相应地对象,一个类可以生成多个不同的对象,这些对象具有 相同的属性。因此,对象也称为类的实例(Instance)。一个类可以由其他的类派生出来,类与类之间 根据具体情况以层次结构组织起来。处于上层的类称为父类,处于下层的类称为子类或派生类。 采用面向对象的方法来进行Windows程序设计还可以简化对资源的管理。将资源映射成一个C++ 对象时,对资源的使用可以翻译成以下C++顺序。 ❑ 创建一个对象:如定义一个画笔对象。 ❑ 使用对象:用画笔绘图。 ❑ 撤销该对象。 一个对象的创建是对一个对象的定义过程,可以由对象的构造函数处理对资源的请求过程。当某 一个对象退出活动范围时,它的撤销可以由编译器来自动管理。 3.1.2 面向对象技术的基本特征 到目前为止,对面向对象的概念的定义仍有不同的认识,但它的几个基本特征,如封装性、继承 性、多态性等,基本上得到认可。 1. 封装性 封装就是把对象的属性和方法结合成一个独立的系统单位,并尽可能隐蔽对象的内部细节。封装 使对象形成两个部分:接口和实现。对于用户来说,接口是可见的,实现是不可见的。同样形式的接 口,其实现可能不同。好比取款机都有相同的取钱接口,但是不同的取款机实现这种取钱的接口方法 不一样。 封装提供了两种保护:其一是保护对象,防止用户误用对象内部的属性和方法;其二是保护客户 端,即实现过程的改变不影响到接口,从而减小对客户端的不利影响。 47 励志照亮人生 编程改变命运 第 4 章 面向对象程序设计与C++语言
Visual c++ 2.继承性 真实的对象不是孤立存在的,每个对象都与其他一个或多个对象相关。事实上,当描述一个新对 象时,往往指出该新对象的特征与已存在的对象的特征有何不同。对于面向对象来说,继承性是指 个新类可以从现有的类中派生出来,新类具有父类中的所有特性,直接继承了父类的方法和数据,新 类的对象可以调用该类及父类的成员变量和成员函数。 如MFC中的 CEdit类,它封装了 Windows中的编辑框控件,它的继承结构如图3.2所示。 类 CObject是所有的MFC类的根类。类 CCmdTarget从类 CObject直 接派生,它是 Microsoft基础类库的消息映射结构的基类。类Cwnd提 供了MFC中所有窗口类的基本功能性,它封装了 Windows中的窗口句 CCmd Target 柄hWnd。类 CEdit从Cwnd直接派生,它提供了对 Windows编辑控件的 特定支持。由于CEd类继承了其基类的数据和方法,因此,可以通过 CEdit类调用Cwnd类中提供的方法来实现对标准 Windows窗口的操作 继承保证了类之间的一致性,父类可以为所有子类定制规则。利 CEdit 用继承可以开发更加贴近现实的模型,增加软件重用的机会,从而降 低开发和维护费用。子类可以继承父类的属性,也可以增加和重新定图32CEdt类的继承结构 义继承的属性。同样,子类可以继承父类的操作,也可以增加或者重新定义继承的操作,这种重新定 义被称为覆盖( Override)。 继承可分为单继承和多继承。单继承指的是子类只从一个父类继承,而多继承则允许子类可以继 承多个父类。例如,交通工具是父类,它有三个子类,分别为空中交通工具、水上交通工具和陆上交 通工具。而一个两栖交通工具则可以同时继承水上交通工具和陆上交通工具。很多面向对象的语言都 不支持多重继承,但C++支持 3.多态性 多态性是指在一般类中定义的属性或方法被特殊类继承后,可以具有不同的数据类型或表现出不 的行为功能。例如,人都有取名字的操作,但是不同的民族取名字的方式不一样,对于一个不知是 民族的人,可以让他执行“人”这个类共有的操作“取名字”时,他实际执行的是以他所属民族的 取名字操作。 在C++中,多态性定义为不同函数的同一接口。从这个定义出发,函数和操作符的重载也属于多态。 说明多态和继承中的重载( Override)是有区别的。多态是运行时问题,而重载( override)是编译 时问题 封装性、继承性和多态性是面向对象编程的三大特征,开始的时候,读者也许对它们还没有非常 清晰的概念,但这没有什么关系,当使用了一段时间C++语言,然后再回过头来看这些概念时,就会 发现对它们有了更深入的认识和了解 3.2C++语言基础 在本节,将简单介绍一下C++语言的基础,包括程序的基本控制结构、基本数据类型、运算符和 表达式、函数和指针的应用等。通过本节的讲解,读者对C++语言的基本程序结构会有所了解 励志照亮人生编程改变命运
2. 继承性 真实的对象不是孤立存在的,每个对象都与其他一个或多个对象相关。事实上,当描述一个新对 象时,往往指出该新对象的特征与已存在的对象的特征有何不同。对于面向对象来说,继承性是指一 个新类可以从现有的类中派生出来,新类具有父类中的所有特性,直接继承了父类的方法和数据,新 类的对象可以调用该类及父类的成员变量和成员函数。 如MFC中的CEdit类,它封装了Windows中的编辑框控件,它的继承结构如图3.2所示。 类CObject是所有的MFC类的根类。类CCmdTarget从类CObject直 接派生,它是Microsoft基础类库的消息映射结构的基类。类CWnd提 供了MFC中所有窗口类的基本功能性,它封装了Windows中的窗口句 柄hWnd。类CEdit从CWnd直接派生,它提供了对Windows编辑控件的 特定支持。由于CEdit类继承了其基类的数据和方法,因此,可以通过 CEdit类调用CWnd类中提供的方法来实现对标准Windows窗口的操作。 继承保证了类之间的一致性,父类可以为所有子类定制规则。利 用继承可以开发更加贴近现实的模型,增加软件重用的机会,从而降 低开发和维护费用。子类可以继承父类的属性,也可以增加和重新定 义继承的属性。同样,子类可以继承父类的操作,也可以增加或者重新定义继承的操作,这种重新定 义被称为覆盖(Override)。 继承可分为单继承和多继承。单继承指的是子类只从一个父类继承,而多继承则允许子类可以继 承多个父类。例如,交通工具是父类,它有三个子类,分别为空中交通工具、水上交通工具和陆上交 通工具。而一个两栖交通工具则可以同时继承水上交通工具和陆上交通工具。很多面向对象的语言都 不支持多重继承,但C++支持。 3. 多态性 多态性是指在一般类中定义的属性或方法被特殊类继承后,可以具有不同的数据类型或表现出不 同的行为功能。例如,人都有取名字的操作,但是不同的民族取名字的方式不一样,对于一个不知是 何民族的人,可以让他执行“人”这个类共有的操作“取名字”时,他实际执行的是以他所属民族的 取名字操作。 在C++中,多态性定义为不同函数的同一接口。从这个定义出发,函数和操作符的重载也属于多态。 说明 多态和继承中的重载(Override)是有区别的。多态是运行时问题,而重载(override)是编译 时问题。 封装性、继承性和多态性是面向对象编程的三大特征,开始的时候,读者也许对它们还没有非常 清晰的概念,但这没有什么关系,当使用了一段时间C++语言,然后再回过头来看这些概念时,就会 发现对它们有了更深入的认识和了解。 3.2 C++语言基础 在本节,将简单介绍一下C++语言的基础,包括程序的基本控制结构、基本数据类型、运算符和 表达式、函数和指针的应用等。通过本节的讲解,读者对C++语言的基本程序结构会有所了解。 48 励志照亮人生 编程改变命运 零基础学 Visual C++ 图3.2 CEdit类的继承结构 CObject CCmdTarget CWnd CEdit
第4章面向对象程序设计与C++ 32.1C++基本控制结构 按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合。 口顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行 口选择结构:程序是按设定的条件实现程序执行流的多路分支。 口循环结构:程序是按给定的条件重复地执行指定的程序段或模块 这三种结构的直观表示如图3.3所示 模块 模块1 模块2 块 循环体 顺序结构 选择结构 循环结构 图3.3三种基本程序结构 在C艹+中,顺序结构的语句包括说明语句、赋值语句、I/O语句、子函数调用语句和返回语句等, 这里不作详细介绍,重点介绍一下C++中的选择结构和循环结构。 1.选择结构 C++中的选择结构分为一路选择分支、两路选择分支和多路选择分支。 (1)一路选择分支 路选择语句格式如下: if(<逻辑表达式> 语句序列可以是一个语句,也可以是复合语句结构,其直观表示如图34所示 (2)两路选择分支 两路选择语句格式如下: 逻辑表达式>) <语句序列2 其直观表示如图3.5所示。 生不成立 成立 不成立 语句序列1 语句序列2 语句序列 图34一路选择分支结构 图3.5两路选择分支结构 励志照亮人生编程改变命
3.2.1 C++基本控制结构 按照结构化程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合。 ❑ 顺序结构:程序是按程序语句或模块在执行流中的顺序逐个执行。 ❑ 选择结构:程序是按设定的条件实现程序执行流的多路分支。 ❑ 循环结构:程序是按给定的条件重复地执行指定的程序段或模块。 这三种结构的直观表示如图3.3所示。 图3.3 三种基本程序结构 在C++中,顺序结构的语句包括说明语句、赋值语句、I/O语句、子函数调用语句和返回语句等, 这里不作详细介绍,重点介绍一下C++中的选择结构和循环结构。 1. 选择结构 C++中的选择结构分为一路选择分支、两路选择分支和多路选择分支。 (1)一路选择分支 一路选择语句格式如下: if (<逻辑表达式>) <语句序列> 语句序列可以是一个语句,也可以是复合语句结构,其直观表示如图3.4所示。 (2)两路选择分支 两路选择语句格式如下: if (<逻辑表达式>) <语句序列1> else <语句序列2> 其直观表示如图3.5所示。 49 励志照亮人生 编程改变命运 第 4 章 面向对象程序设计与C++语言 模块1 模块1 顺序结构 选择结构 循环结构 条件 条件 模块2 模块2 循环体 Y N N Y 图3.4 一路选择分支结构 图3.5 两路选择分支结构 条件? 不成立 条件? 成立 不成立 成立 语句序列 语句序列1 语句序列2
Visual c++ (3)多路选择分支 也可以使用if语句实现多路选择分支,语句格式如下: <逻辑表达式 e1seif(<逻辑表达式2>) 语句序列2> else应和最近的if嵌套,其直观表示如图3.6所示。 switch语句也可以实现多路(开关)选择结构,其语句格式如下: switch(<整数表达式>) 值 <语句序列1> case数值 其直观表示如图3.7所示。 不成立 不成立 语句序列 3.6ⅱ语句实现多路选择分支 图3.7 switch语句实现多路选择分支 2.循环结构 C艹中有三种循环语句构建方式: while循环、 do while循环和for循环。 (1) while循环 while循环语句格式可表示如下 whi1e(<逻辑表达式>) <循环体>} 其直观表示如图3.8所示。 (2) do while循环 do while循环语句格式可表示如下: 励志照亮人生编程改变命运
(3)多路选择分支 也可以使用if语句实现多路选择分支,语句格式如下: if (<逻辑表达式>) <语句序列1> else if (<逻辑表达式2>) <语句序列2> else <语句序列3> else应和最近的if嵌套,其直观表示如图3.6所示。 switch语句也可以实现多路(开关)选择结构,其语句格式如下: switch(<整数表达式>) { case 数值1: <语句序列1>; break; ...... case 数值n: <语句序列n>; break; [default : <语句序列n+1>;] } 其直观表示如图3.7所示。 2. 循环结构 C++中有三种循环语句构建方式:while循环、do_while循环和for循环。 (1)while循环 while循环语句格式可表示如下: while(<逻辑表达式>) {<循环体> } 其直观表示如图3.8所示。 (2)do_while循环 do_while循环语句格式可表示如下: 50 励志照亮人生 编程改变命运 零基础学 Visual C++ 图3.6 if语句实现多路选择分支 图3.7 switch语句实现多路选择分支 语句序列1 语句序列2 语句序列3 语句序列2 …… 语句序列n 值=? 计算整型表达式 语句序列1 成立 成立 不成立 不成立 条件? 条件?