1、C+C+语言程序设计语言程序设计教学法讲座教学法讲座清华大学 郑莉C+C+语言程序设计语言程序设计 教学法讲座(教学法讲座(1 1):课程概述):课程概述清华大学 郑莉3目录目录 课程理念课程理念 教材简介教材简介 教学建议教学建议 配套资源配套资源 课程网址课程网址4课程理念课程理念 C+作为第一门程序设计课程作为第一门程序设计课程 C+语言支持面向对象的观念,更接近于人语言支持面向对象的观念,更接近于人类的思维方式,因而也就更容易为初学者所类的思维方式,因而也就更容易为初学者所接受。接受。在教学中抓住主线、突出重点、强调思想方在教学中抓住主线、突出重点、强调思想方法、注重实践环节,便可以克
2、服语法复杂的法、注重实践环节,便可以克服语法复杂的难点。难点。从从6年来在清华大学的教学实践来看,以年来在清华大学的教学实践来看,以C+作为第一门高级程序设计语言来教是可作为第一门高级程序设计语言来教是可行的。行的。5课程理念课程理念 第一门语言课的教学目标第一门语言课的教学目标 语言只是一种表达工具,自然语言亦是如此。语言只是一种表达工具,自然语言亦是如此。程序设计语言可以用来表达需要解决的问题程序设计语言可以用来表达需要解决的问题和解决问题的方法,但是方法本身不属于语和解决问题的方法,但是方法本身不属于语言的范畴,要在其它课程中学习。例如:计言的范畴,要在其它课程中学习。例如:计算方法、数
3、据结构等。算方法、数据结构等。学习语言需要实践,因而离不开对分析问题学习语言需要实践,因而离不开对分析问题和解决问题方法的学习。但是初学者的目标和解决问题方法的学习。但是初学者的目标应定位在编写小程序、解决简单问题。应定位在编写小程序、解决简单问题。6课程理念课程理念 在有限的学时中先了解什么在有限的学时中先了解什么 树木还是森林?树木还是森林?先讲授面向过程的结构化程序设计,后讲面先讲授面向过程的结构化程序设计,后讲面向对象的思想向对象的思想先见树木,后见森林。先见树木,后见森林。先从细微处着眼,首先关注算法与技巧。先从细微处着眼,首先关注算法与技巧。熟练掌握基本的编程技术以后,再学习面向对
4、象熟练掌握基本的编程技术以后,再学习面向对象的思想和方法。的思想和方法。优点:技巧训练充分、基本技术过硬。优点:技巧训练充分、基本技术过硬。缺点:先入为主,接受面向对象的思想较难。缺点:先入为主,接受面向对象的思想较难。7课程理念课程理念 在有限的学时中先了解什么在有限的学时中先了解什么 树木还是森林?树木还是森林?先介绍面向对象的思想与方法,再训练程序设先介绍面向对象的思想与方法,再训练程序设计的方法与技巧计的方法与技巧先见森林,后见树木。先见森林,后见树木。首先学会将人类的自然思维方法用于程序设计。首先学会将人类的自然思维方法用于程序设计。首先建立系统与全局的观念。首先建立系统与全局的观念
5、。在实践环节和后续课程中,不断学习各种算法、训在实践环节和后续课程中,不断学习各种算法、训练编程技巧。练编程技巧。优点:首先学习高度抽象的思维方法,建立系统和优点:首先学习高度抽象的思维方法,建立系统和全局的观念,为后续学习奠定了思想方法的基础。全局的观念,为后续学习奠定了思想方法的基础。缺点:对教材与教师的要求较高,若不能立足于较缺点:对教材与教师的要求较高,若不能立足于较高的位置、深入浅出地讲解,会使课程空洞无物、高的位置、深入浅出地讲解,会使课程空洞无物、枯燥无味。枯燥无味。8教材简介教材简介 教材系列教材系列 C+语言程序设计(第语言程序设计(第3版)版)C+语言程序设计(第语言程序设
6、计(第3版)学生用书版)学生用书 C+语言程序设计(第语言程序设计(第3版)教师用书版)教师用书 C+语言程序设计案例教程语言程序设计案例教程 内容编排原则:内容编排原则:不割裂面向过程部分与面向对象部分,以面不割裂面向过程部分与面向对象部分,以面向对象的程序设计思想贯穿始终。向对象的程序设计思想贯穿始终。9实践环节实践环节这门课的实践性很强,教师需要强调这门课的实践性很强,教师需要强调并引导学生通过实践加深对课程内容的理并引导学生通过实践加深对课程内容的理解、提高编程能力。为此,本书设计了配解、提高编程能力。为此,本书设计了配套的学生用书,包括学习指南、各章要点套的学生用书,包括学习指南、各
7、章要点导读、实验指导、习题解答。教师应该要导读、实验指导、习题解答。教师应该要求学生上机运行每一道例题,完成各章的求学生上机运行每一道例题,完成各章的实验任务,尽量多做习题。来不及做的习实验任务,尽量多做习题。来不及做的习题,可以参考习题解答,将习题解答作为题,可以参考习题解答,将习题解答作为补充的例题来使用。补充的例题来使用。10配套资源配套资源 教师用书(电子版),包括电子讲稿(教师用书(电子版),包括电子讲稿(PPT文文件)、讲课要点、考试样题。件)、讲课要点、考试样题。学生用书,包括学习指南、各章要点导读、实学生用书,包括学习指南、各章要点导读、实验指导、习题解答。验指导、习题解答。案
8、例教程及案例课件库案例教程及案例课件库 例题、实验参考程序源代码。例题、实验参考程序源代码。视频课件、配音课件视频课件、配音课件 作者的教学网站,可以下载讲稿、录音,在线作者的教学网站,可以下载讲稿、录音,在线学习,参与讨论。学习,参与讨论。11案例课件库案例课件库 http:/166.111.70.10:8080/demo/12清华网络学堂清华网络学堂课程网址课程网址 清华课程网址清华课程网址http:/ 网页主要内容网页主要内容 电子教案(电子教案(PPT)与讲课录音()与讲课录音(mp3)在线讲堂(视频课件)在线讲堂(视频课件)参考资料参考资料 例题源程序例题源程序 答疑、讨论答疑、讨论
9、13郑莉的网络课堂郑莉的网络课堂 http:/ 电子教案与讲课录音电子教案与讲课录音 例题源程序例题源程序C+C+语言程序设计语言程序设计 教学法讲座(教学法讲座(2 2):程序设计基础):程序设计基础15目录目录 对应章节对应章节 背景知识的重要性背景知识的重要性 思想方法的重要性思想方法的重要性 基础知识如何介绍基础知识如何介绍 培养编程实践能力的开端培养编程实践能力的开端 基础语法的介绍方法基础语法的介绍方法 函数的讲法函数的讲法 实验课安排实验课安排16对应章节对应章节 第第1章章 绪绪 论论 第第2章章 C+简单程序设计简单程序设计 第第3章章 函数函数17背景知识的重要性背景知识的
10、重要性 了解相关背景知识可以使学生从一开始了解相关背景知识可以使学生从一开始就站在全局的、宏观的角度看问题,避就站在全局的、宏观的角度看问题,避免单纯陷入语法细节,造成学会了语法免单纯陷入语法细节,造成学会了语法却不会写程序的后果。却不会写程序的后果。要使学生了解要使学生了解 计算机程序的作用和意义计算机程序的作用和意义 程序语言和程序设计技术的发展历程程序语言和程序设计技术的发展历程 程序设计在软件开发中的地位程序设计在软件开发中的地位 对应讲稿:第对应讲稿:第1章章3-7页,页,21-26页页18思想方法的重要性思想方法的重要性 以面向对象的程序设计思想贯穿始终以面向对象的程序设计思想贯穿
11、始终 在绪论课中浅显地介绍面向对象的思想在绪论课中浅显地介绍面向对象的思想 以后在讲授每个新的语法知识点时,都要从以后在讲授每个新的语法知识点时,都要从面向对象思想的角度阐释面向对象思想的角度阐释 以面向对象的思想为起点,使学生将这以面向对象的思想为起点,使学生将这种程序设计思想与人类自然的思维方法种程序设计思想与人类自然的思维方法统一统一 对应讲稿:第对应讲稿:第1章章8-20页页19基础知识如何介绍基础知识如何介绍 信息的表示与存储相关知识对于程序设信息的表示与存储相关知识对于程序设计课程是必须的。计课程是必须的。如果有其他课程介绍相关知识,这部分如果有其他课程介绍相关知识,这部分内容可以
12、不讲。内容可以不讲。如果没有其他课程介绍这部分内容,应如果没有其他课程介绍这部分内容,应考虑在课上讲授,或安排自学辅导。考虑在课上讲授,或安排自学辅导。对应讲稿:第对应讲稿:第1章章27-41页页20培养编程实践能力的开端培养编程实践能力的开端 简单介绍上机编写程序的过程简单介绍上机编写程序的过程 简单介绍相关术语和概念简单介绍相关术语和概念 通过实验一,指导学生学会变异环境的通过实验一,指导学生学会变异环境的使用使用 对应讲稿:第对应讲稿:第1章章42-45页页21基础语法的介绍方法基础语法的介绍方法基础语法内容基础语法内容 C+语言概述语言概述 基本数据类型和表达基本数据类型和表达式式 数
13、据的输入与输出数据的输入与输出 基本控制结构基本控制结构 自定义数据类型自定义数据类型 函数的声明和调用函数的声明和调用 函数间的参数传递函数间的参数传递 内联函数内联函数 带默认形参值的函数带默认形参值的函数 函数重载函数重载 C+系统函数系统函数22基础语法的介绍方法基础语法的介绍方法C+语言概述语言概述 阐述与的关系,同时说明学习阐述与的关系,同时说明学习不必首先学习面向过程的语言。不必首先学习面向过程的语言。介绍基本语法成分时,采用与自然语言介绍基本语法成分时,采用与自然语言的语法成分类比的方法。的语法成分类比的方法。强调越丰富的语法规则为语言提供越强强调越丰富的语法规则为语言提供越强
14、的表现力,可以与自然语言类比来讲,的表现力,可以与自然语言类比来讲,使学生对繁多的语法不要产生抵触使学生对繁多的语法不要产生抵触 对应讲稿:第对应讲稿:第2章章3-8页页23基础语法的介绍方法基础语法的介绍方法基本数据类型和表达式基本数据类型和表达式 阐明这部分语法的重要性:数据处理与阐明这部分语法的重要性:数据处理与计算是计算机程序的最基本功能,要使计算是计算机程序的最基本功能,要使程序能够处理计算问题,就需要能够对程序能够处理计算问题,就需要能够对各种类型的数据和运算进行模拟。各种类型的数据和运算进行模拟。在讲课中强调每一种数据类型模拟了哪在讲课中强调每一种数据类型模拟了哪些实际数据,用途
15、是什么。具体语法规些实际数据,用途是什么。具体语法规定可以淡化,留给学生自学。定可以淡化,留给学生自学。对应讲稿:第对应讲稿:第2章章9-38页页24基础语法的介绍方法基础语法的介绍方法数据的输入与输出数据的输入与输出 C+没有输入没有输入/输出语句输出语句 输入输入/输出被看作信息的流动输出被看作信息的流动 输入输入/输出功能通过输出功能通过I/O流类库实现。优点:流类库实现。优点:功能丰富、灵活,易于扩充功能丰富、灵活,易于扩充 只通过例题简单介绍标准输入只通过例题简单介绍标准输入/输出,格输出,格式控制不作为重点,可以不讲。式控制不作为重点,可以不讲。对应讲稿:第对应讲稿:第2章章42页
16、页25基础语法的介绍方法基础语法的介绍方法基本控制结构基本控制结构 介绍每种分支与循环语句时,首先从涉介绍每种分支与循环语句时,首先从涉及分支与循环的实际问题入手,给出解及分支与循环的实际问题入手,给出解决问题的程序实例,然后引导学生从中决问题的程序实例,然后引导学生从中发现分支与循环语句的用法,最后给出发现分支与循环语句的用法,最后给出语法规定。语法规定。对于语法细节可以淡化,留给学生自学。对于语法细节可以淡化,留给学生自学。关键要讲清楚用途、用法。关键要讲清楚用途、用法。对应讲稿:第对应讲稿:第2章章43-74页页26基础语法的介绍方法基础语法的介绍方法自定义数据类型自定义数据类型 基本数
17、据类型不足以模拟复杂的实际数据,于基本数据类型不足以模拟复杂的实际数据,于是语法提供了自定义数据类型的机制。是语法提供了自定义数据类型的机制。枚举实际上是整数集合的子集,用以定义由有枚举实际上是整数集合的子集,用以定义由有限整数构成的数据类型,与使用整数类型相比,限整数构成的数据类型,与使用整数类型相比,可以获得由语法保证的数据和发行检验。可以获得由语法保证的数据和发行检验。结构体是将具有内在逻辑联系的不同类型数据结构体是将具有内在逻辑联系的不同类型数据组合在一起构成新的数据类型。是从组合在一起构成新的数据类型。是从C语言继语言继承的,面向过程的,不能规定对新数据类型的承的,面向过程的,不能规
18、定对新数据类型的处理方法。处理方法。对应讲稿:第对应讲稿:第2章章75-88页页27基础语法的介绍方法基础语法的介绍方法函数函数 函数是定义和实现一个功能模块的机制函数是定义和实现一个功能模块的机制 在面向过程的程序设计中,函数是程序在面向过程的程序设计中,函数是程序模块的最小单位。模块的最小单位。在面向对象的程序设计中,函数是类的在面向对象的程序设计中,函数是类的行为的体现。行为的体现。28基础语法的介绍方法基础语法的介绍方法函数的声明和调用函数的声明和调用 函数定义是函数功能的具体实现代码函数定义是函数功能的具体实现代码 使用函数以前要声明函数原型使用函数以前要声明函数原型 函数调用和返回
19、的过程要讲透函数调用和返回的过程要讲透 函数递归调用是难点,从以下几方面讲函数递归调用是难点,从以下几方面讲 一些实际问题和解决问题的方法本身的描述是递归一些实际问题和解决问题的方法本身的描述是递归的,典型例子是阶乘。的,典型例子是阶乘。演示简单递归问题的函数调用过程演示简单递归问题的函数调用过程 要求学生课后通过开发环境的调试工具观察递归调要求学生课后通过开发环境的调试工具观察递归调用的过程。用的过程。对应讲稿:第对应讲稿:第3章章3-41页页29基础语法的介绍方法基础语法的介绍方法函数的参数传递函数的参数传递 形参在形实结合时才分配内存空间并被形参在形实结合时才分配内存空间并被初始化初始化
20、 形实结合时参数单向传递(传值)。以形实结合时参数单向传递(传值)。以数据交换不成功的典型例子来演示。数据交换不成功的典型例子来演示。介绍引用作形参。在此介绍引用类型学介绍引用作形参。在此介绍引用类型学生比较容易理解。生比较容易理解。对应讲稿:第对应讲稿:第3章章42-49页页30基础语法的介绍方法基础语法的介绍方法内联函数内联函数 从兼顾执行效率和程序结构的角度来引从兼顾执行效率和程序结构的角度来引入内联函数。前面讲透了函数调用的执入内联函数。前面讲透了函数调用的执行过程,这里学生才能理解函数调用的行过程,这里学生才能理解函数调用的效率问题效率问题 编译器在执行优化时可能会自主决定函编译器在
21、执行优化时可能会自主决定函数是否内联数是否内联 对应讲稿:第对应讲稿:第3章章50-51页页31基础语法的介绍方法基础语法的介绍方法带默认形参值的函数带默认形参值的函数 实际问题中很多时候是有默认值的,举实际问题中很多时候是有默认值的,举一些例子。为了模拟这些情况,程序中一些例子。为了模拟这些情况,程序中也需要为函数处理的数据设置默认值也需要为函数处理的数据设置默认值 对应讲稿:第对应讲稿:第3章章52-55页页32基础语法的介绍方法基础语法的介绍方法函数重载函数重载 重载的思想,与人类自然的思维方式是重载的思想,与人类自然的思维方式是一致的。一致的。重载使得具有相似但不同功能的函数可重载使得
22、具有相似但不同功能的函数可以拥有相同的函数名,方面了函数的使以拥有相同的函数名,方面了函数的使用者。用者。重载类的成员函数可以提高类通用性重载类的成员函数可以提高类通用性 对应讲稿:第对应讲稿:第3章章56-62页页33基础语法的介绍方法基础语法的介绍方法C+系统函数系统函数 C+的系统函数是从的系统函数是从c语言继承来的,对语言继承来的,对应的头文件是应的头文件是 系统函数的说明文档可以查阅编译系统系统函数的说明文档可以查阅编译系统的帮助,学生应该学会阅读英文的帮助的帮助,学生应该学会阅读英文的帮助文档。文档。34实验课安排实验课安排 实验一(实验一(2学时)学时)集成开发环境应用入门集成开
23、发环境应用入门 实验二(实验二(4学时)学时)学会编写简单的学会编写简单的C+程序。程序。复习基本语法及简单的输入输出。复习基本语法及简单的输入输出。观察头文件的作用。观察头文件的作用。学会使用集成开发环境中的学会使用集成开发环境中的debug调试功能:调试功能:单步执行、设置断点、观察变量值。单步执行、设置断点、观察变量值。35实验课安排实验课安排 实验三(实验三(2学时)学时)掌握函数的定义和调用方法。掌握函数的定义和调用方法。练习重载函数的使用。练习重载函数的使用。练习使用系统函数。练习使用系统函数。学习使用学习使用VC+的的debug调试功能,使用调试功能,使用step into追踪到
24、函数内部。追踪到函数内部。36小结小结 程序设计基础部分的讲解要从大处着眼,程序设计基础部分的讲解要从大处着眼,强调强调 面向对象的思想面向对象的思想 程序在模拟和解决现实问题中的作用程序在模拟和解决现实问题中的作用 每一种语法规定的用途和意义每一种语法规定的用途和意义 淡化语法细节,切忌纯粹罗列语法淡化语法细节,切忌纯粹罗列语法 通过自学、实验和作业掌握、巩固基础通过自学、实验和作业掌握、巩固基础语法。要安排足够的上机辅导和答疑,语法。要安排足够的上机辅导和答疑,作业可以多留一些,以加强基础训练。作业可以多留一些,以加强基础训练。C+C+语言程序设计语言程序设计 教学法讲座教学法讲座(3)(
25、3):类的概念:类的概念清华大学 郑莉38目录目录 对应章节对应章节 面向对象的思想背景面向对象的思想背景 超越语法介绍类与对象超越语法介绍类与对象 特殊成员函数的讲解切入点特殊成员函数的讲解切入点 类的组合类的组合 实验课安排实验课安排39对应章节对应章节 第第4章章 面向对象程序设计的基本特点面向对象程序设计的基本特点 类和对象类和对象 构造函数和析构函数构造函数和析构函数 类的组合类的组合 UML图形标识图形标识 程序实例程序实例-人员信息管理系统人员信息管理系统40面向对象的思想背景面向对象的思想背景 现实中的类与对象现实中的类与对象 计算机程序对现实问题的模拟计算机程序对现实问题的模
26、拟 程序中基本数据类型的局限性及自定义程序中基本数据类型的局限性及自定义类型的必要性类型的必要性“类型类型”的含义:数据的含义:数据+处理函数处理函数 自定义类型的途径自定义类型的途径类类41超越语法介绍类与对象超越语法介绍类与对象 从现实问题出发举例说明对象的实际意义从现实问题出发举例说明对象的实际意义 从对现实事物的分类管理角度引出抽象与分类从对现实事物的分类管理角度引出抽象与分类观点观点 从现实中物体的封装出发说明封装的必要性,从现实中物体的封装出发说明封装的必要性,引出引出C+中的封装机制中的封装机制类类 以现实中封装物体的内部构造与外部接口,以以现实中封装物体的内部构造与外部接口,以
27、及程序对现实的模拟角度,介绍成员的访问属及程序对现实的模拟角度,介绍成员的访问属性。性。对应讲稿:第对应讲稿:第4章章13-28页页42构造与析构函数构造与析构函数 回顾基本类型变量初始化的过程回顾基本类型变量初始化的过程 对象初始化的必要性及其困难对象初始化的必要性及其困难 自定义的初始化自定义的初始化构造函数构造函数 对象的对象的“克隆克隆”拷贝构造拷贝构造 对象消亡前的对象消亡前的“善后善后”与析构函数与析构函数 对应讲稿:第对应讲稿:第4章章29-46页页43类重用的方式之一类重用的方式之一组合组合 部件组装的思想背景部件组装的思想背景 组合类与成员对象间的组合类与成员对象间的“has
28、-a”关系关系 组合类的部件成员组合类的部件成员 组合类对象的构造与析构组合类对象的构造与析构 对应讲稿:第对应讲稿:第4章章47-58页页44实验课安排实验课安排 实验四(实验四(4学时)学时)掌握类的声明和使用。掌握类的声明和使用。掌握类的声明和对象的声明。掌握类的声明和对象的声明。复习具有不同访问属性的成员的访问方式。复习具有不同访问属性的成员的访问方式。观察构造函数和析构函数的执行过程。观察构造函数和析构函数的执行过程。学习类的组合使用方法。学习类的组合使用方法。使用使用VC+的的debug调试功能观察程序流程,跟踪观调试功能观察程序流程,跟踪观察类的构造函数、析构函数、成员函数的执行
29、顺序。察类的构造函数、析构函数、成员函数的执行顺序。45小结小结 对类与对象的介绍要以实际问题为背景对类与对象的介绍要以实际问题为背景 对类的抽象、封装与隐藏机制要着重讲对类的抽象、封装与隐藏机制要着重讲解其意义和作用解其意义和作用 构造、析构函数重点讲其用途构造、析构函数重点讲其用途 类的组合中类的组合中“has-a”关系的应用背景关系的应用背景C+C+语言程序设计语言程序设计 教学法讲座教学法讲座(4)(4):数据共享与程序结构:数据共享与程序结构清华大学 郑莉47目录目录 对应章节对应章节 数据共享的需求与途径数据共享的需求与途径 数据共享的相关语法数据共享的相关语法 共享数据的安全性共
30、享数据的安全性 编译预处理命令与多文件结构编译预处理命令与多文件结构48对应章节对应章节 第第5章章 作用域与可见性作用域与可见性 对象的生存期对象的生存期 数据与函数数据与函数 静态成员静态成员 共享数据的保护共享数据的保护 友元友元 编译预处理命令编译预处理命令 多文件结构和工程多文件结构和工程 本章内容的特点:与数据的共享和保护相关本章内容的特点:与数据的共享和保护相关49变量的寿命、作用域、可见性变量的寿命、作用域、可见性 理解变量的寿命、作用域、可见性是数理解变量的寿命、作用域、可见性是数据共享的基础据共享的基础 寿命寿命 静态生存期:全局寿命静态生存期:全局寿命 动态生存期:局部寿
31、命动态生存期:局部寿命 以典型实例演示寿命、作用域、可见性以典型实例演示寿命、作用域、可见性的综合效果,可以借助调试工具演示的综合效果,可以借助调试工具演示 对应讲稿:第对应讲稿:第5章章3-22页页50数据共享的需求与途径数据共享的需求与途径 函数间需要数据共享函数间需要数据共享 同一个类的对象间需要数据共享同一个类的对象间需要数据共享 不同类之间需要数据共享不同类之间需要数据共享51数据共享的相关语法(一)数据共享的相关语法(一)函数间的数据共享函数间的数据共享 全局变量、函数参数、返回值全局变量、函数参数、返回值 将共享的数据与共享数据的函数封装成类将共享的数据与共享数据的函数封装成类
32、对应讲稿:第对应讲稿:第5章章23-25页页52数据共享的相关语法(二)数据共享的相关语法(二)同一个类的对象间数据共享同一个类的对象间数据共享 静态成员,也称类成员静态成员,也称类成员 静态数据成员静态数据成员 该类的所有对象共享该成员的同一个拷贝该类的所有对象共享该成员的同一个拷贝 静态函数成员静态函数成员 类外代码可以使用类名和作用域操作符来调用静态类外代码可以使用类名和作用域操作符来调用静态成员函数。成员函数。静态成员函数只能直接引用属于该类的静态数据成静态成员函数只能直接引用属于该类的静态数据成员或静态成员函数。员或静态成员函数。对应讲稿:第对应讲稿:第5章章26-32页页53数据共
33、享的相关语法(三)数据共享的相关语法(三)不同类之间的数据共享不同类之间的数据共享 友元函数友元函数 友元类友元类 对应讲稿:第对应讲稿:第5章章33-40页页54共享数据的安全保护共享数据的安全保护 常类型常类型 常引用:保护被引用的对象常引用:保护被引用的对象 常对象:对象本身不可改变,用常成员函数常对象:对象本身不可改变,用常成员函数访问访问 常指针:保护被指向的对象常指针:保护被指向的对象 对应讲稿:第对应讲稿:第5章章41-48页页55编译预处理命令与多文件结构编译预处理命令与多文件结构 主要通过学生自学与实验掌握主要通过学生自学与实验掌握56实验课安排实验课安排 实验五(实验五(2
34、学时)学时)观察程序运行中变量的作用域、生存期和观察程序运行中变量的作用域、生存期和可见性;可见性;学习类的静态成员的使用;学习类的静态成员的使用;学习多文件结构在学习多文件结构在C+程序中的使用;程序中的使用;57小结小结 讲授本章内容时最主要的是找到主线讲授本章内容时最主要的是找到主线索索共享与保护,要避免杂乱无章共享与保护,要避免杂乱无章 重点在静态成员、友元、常类型重点在静态成员、友元、常类型 要强调学生在实验中的亲自动手调试、要强调学生在实验中的亲自动手调试、观察观察C+C+语言程序设计语言程序设计 教学法讲座教学法讲座(5)(5):数组与指针:数组与指针清华大学 郑莉59目录目录
35、对应章节对应章节 数组概念的引入数组概念的引入 数组的讲解要点数组的讲解要点 数组的适用场合、优点、缺点数组的适用场合、优点、缺点 指针的讲解要点指针的讲解要点 直接使用内存地址的优点及缺点直接使用内存地址的优点及缺点 动态内存分配及对象深拷贝问题动态内存分配及对象深拷贝问题 字符串的存储与处理字符串的存储与处理60对应章节对应章节 第第6章章 数组数组 指针指针 动态内存分配动态内存分配 深拷贝与浅拷贝深拷贝与浅拷贝 字符串字符串 程序实例程序实例-人员信息管理系统改进人员信息管理系统改进61如何处理大量同类型对象如何处理大量同类型对象 对同类型对象群体中每一个体往往使用同样的对同类型对象群
36、体中每一个体往往使用同样的处理方法。可否使用循环语句?关键是在循环处理方法。可否使用循环语句?关键是在循环体中如何以统一的方式标识每一个体变量。体中如何以统一的方式标识每一个体变量。群体中的对象往往具有逻辑上的密切联系,或群体中的对象往往具有逻辑上的密切联系,或存在次序关系。如何以数据结构来描述这种关存在次序关系。如何以数据结构来描述这种关系?系?数组恰恰是解决上述问题的数据结构。数组恰恰是解决上述问题的数据结构。对应讲稿:第对应讲稿:第6章第章第3页页62数组的讲解要点数组的讲解要点 数组的声明与引用数组的声明与引用 以统一的名称命名一组变量以统一的名称命名一组变量 以下标表示元素的序号以下
37、标表示元素的序号 数组的实质数组的实质 数组名即数组的首地址数组名即数组的首地址 数组元素在内存中是按次序连续存放的数组元素在内存中是按次序连续存放的 对多维数组的理解对多维数组的理解 二维数组可以看成是一维数组的数组二维数组可以看成是一维数组的数组 二维数组按行存放二维数组按行存放 对象数组的构造需要调用元素类的构造函数对象数组的构造需要调用元素类的构造函数 对应讲稿:第对应讲稿:第6章章4-27页页63数组的适用场合举例数组的适用场合举例 用于存储同类型的数据序列用于存储同类型的数据序列 用于在函数间传递大批数据用于在函数间传递大批数据 以数组名为参数,传递数组的首地址而不是以数组名为参数
38、,传递数组的首地址而不是元素值元素值 要注意:对形参数组的修改会直接反映到实要注意:对形参数组的修改会直接反映到实参数组中参数组中64数组的主要优点与缺点数组的主要优点与缺点 优点优点 便于按统一方式处理大量同类型数据便于按统一方式处理大量同类型数据 支持对同类型数据序列的随机访问支持对同类型数据序列的随机访问 便于在函数之间共享大量数据便于在函数之间共享大量数据 缺点缺点 插入插入/删除删除/重新排列元素时需要大量移动元素。重新排列元素时需要大量移动元素。存在下标越界等安全隐患存在下标越界等安全隐患 长度不可动态调整长度不可动态调整65指针的讲解要点指针的讲解要点 访问程序的内存单元既可以通
39、过变量名,也可以通过访问程序的内存单元既可以通过变量名,也可以通过地址地址 指针是存放地址的变量指针是存放地址的变量 指针只有被赋予合法地址以后,才能使用指针只有被赋予合法地址以后,才能使用 指针的运算规则与指向的类型相关指针的运算规则与指向的类型相关 指针可以接受动态分配的内存地址指针可以接受动态分配的内存地址 指向函数的指针可以增加程序的通用性指向函数的指针可以增加程序的通用性 this指针使得非静态成员函数可以识别处理的对象指针使得非静态成员函数可以识别处理的对象 指向类非静态成员的指针必须与对象名指向类非静态成员的指针必须与对象名/对象指针联合对象指针联合使用使用 对应讲稿:第对应讲稿
40、:第6章章28-86页页66使用内存地址的优点及缺使用内存地址的优点及缺点点 优点优点 灵活高效灵活高效 支持动态内存分配支持动态内存分配 有利于数据共享有利于数据共享 缺点缺点 安全性差,可能会出现对内存的非法访问安全性差,可能会出现对内存的非法访问 使程序的可读性下降使程序的可读性下降 注意事项注意事项 使用指针时要确保其含有有效地址,例如不要使用使用指针时要确保其含有有效地址,例如不要使用未被初始化的指针,函数不要返回动态局部变量的未被初始化的指针,函数不要返回动态局部变量的地址等地址等67例题:动态数组类例题:动态数组类 主要知识点主要知识点 动态内存分配动态内存分配 在析构函数中释放
41、动态分配的内存空间在析构函数中释放动态分配的内存空间 深拷贝与浅拷贝问题深拷贝与浅拷贝问题 对应讲稿:第对应讲稿:第6章章87-89,96-105页页68字符串的存储与处理字符串的存储与处理 以字符数组存储字符串以字符数组存储字符串C语言的方法语言的方法 具有数组固有的安全隐患具有数组固有的安全隐患 只能使用库函数进行处理只能使用库函数进行处理 使用使用String类类 安全性好安全性好 封装了处理函数,重载了运算符封装了处理函数,重载了运算符 对应讲稿:第对应讲稿:第6章章106-118页页69实验课安排实验课安排 实验六(实验六(4学时)学时)学习使用数组数据对象;学习使用数组数据对象;学
42、习字符串数据的组织和处理;学习字符串数据的组织和处理;学习标准学习标准C+库的使用;库的使用;掌握指针的使用方法;掌握指针的使用方法;练习通过练习通过debug观察指针的内容及其所指的对象的观察指针的内容及其所指的对象的内容;内容;练习通过动态内存分配实现动态数组,并体会指针练习通过动态内存分配实现动态数组,并体会指针在其中的作用;在其中的作用;分别使用字符数组和标准分别使用字符数组和标准C+库练习处理字符串的库练习处理字符串的方法。方法。70小结小结 本章两大主要知识点是:数组和指针本章两大主要知识点是:数组和指针 介绍数组关键在于概念的引入、数组的用途。介绍数组关键在于概念的引入、数组的用
43、途。同时要指出数组这种数据结构的不足之处。同时要指出数组这种数据结构的不足之处。指针部分对于初学者的难度较大,主要是对地指针部分对于初学者的难度较大,主要是对地址的理解问题,要讲透。址的理解问题,要讲透。通过通过this指针说明类的非静态成员函数为什么指针说明类的非静态成员函数为什么能识别处理的对象能识别处理的对象 对象的深拷贝问题、拷贝构造函数的必要性、对象的深拷贝问题、拷贝构造函数的必要性、析构函数的必要性,都要在本章讲清楚析构函数的必要性,都要在本章讲清楚C+C+语言程序设计语言程序设计 教学法讲座教学法讲座(6)(6):类的继承与多态:类的继承与多态清华大学 郑莉72目录目录内容构成内
44、容构成继承机制的实际意义,以及继承机制的实际意义,以及“is-a”关系关系继承时的成员访问控制继承时的成员访问控制继承时的构造、析构函数继承时的构造、析构函数解决多继承时的冗余和二义性问题解决多继承时的冗余和二义性问题虚继承虚继承多态机制的背景和意义多态机制的背景和意义静态多态性:函数重载和运算符重载静态多态性:函数重载和运算符重载动态多态性:虚函数动态多态性:虚函数73对应章节对应章节 第第7章章 继承与派生继承与派生 继承与派生继承与派生 访问控制访问控制 类型兼容规则类型兼容规则 派生类的构造和析构函数派生类的构造和析构函数 派生类成员的标识与访问派生类成员的标识与访问 程序实例程序实例
45、-人员信息管理人员信息管理 第第8章章 多态性多态性 多态性概述多态性概述 运算符重载运算符重载 虚函数虚函数 抽象类抽象类 程序实例程序实例-对于一个小型公司的人员信息管理程序的改进对于一个小型公司的人员信息管理程序的改进74继承机制的实际意义继承机制的实际意义 从一些容易理解的实例出发,解释从一些容易理解的实例出发,解释“继继承承”的意义的意义 概念的继承和代码的重用概念的继承和代码的重用 对新问题的适应对新问题的适应 对应讲稿:第对应讲稿:第7章章3-8页页75继承时的成员访问控制继承时的成员访问控制 继承过程中可以设定访问控制权限继承过程中可以设定访问控制权限 无论以任何方式继承,基类
46、的成员都存无论以任何方式继承,基类的成员都存在于派生类的对象中。在于派生类的对象中。基类的私有成员只能通过公有接口访问基类的私有成员只能通过公有接口访问 对应讲稿:第对应讲稿:第7章章9-23页页76继承时的构造、析构函数继承时的构造、析构函数 构造函数和析构函数不被继承构造函数和析构函数不被继承基类的构造基类的构造函数只能初始化从基类继承来的成员。派生类函数只能初始化从基类继承来的成员。派生类新增成员要自己设计构造函数来初始化新增成员要自己设计构造函数来初始化 理解构造函数的执行次序和参数转递理解构造函数的执行次序和参数转递 首先初始化基类子对象、对象成员,最后初始化派首先初始化基类子对象、
47、对象成员,最后初始化派生类新增成员生类新增成员 派生类要负责为基类的构造函数和对象成员的构造派生类要负责为基类的构造函数和对象成员的构造函数转递参数函数转递参数 如果为一个类编写了构造函数,就最好再写一个默如果为一个类编写了构造函数,就最好再写一个默认的构造函数认的构造函数 析构函数的调用次序与构造函数相反析构函数的调用次序与构造函数相反77虚继承虚继承 多继承有可能导致冗余和二义性问题,多继承有可能导致冗余和二义性问题,可以通过虚继承解决可以通过虚继承解决 继承一个类时,很难预料将来是否会出继承一个类时,很难预料将来是否会出现二义性,虚继承的基类及各派生类,现二义性,虚继承的基类及各派生类,
48、直至最远派生类通常是由一个人或项目直至最远派生类通常是由一个人或项目组一次设计完成的组一次设计完成的 能不用虚继承尽量不用,会给后继派生能不用虚继承尽量不用,会给后继派生类增加复杂性类增加复杂性78多态机制的背景和意义多态机制的背景和意义 要从我们熟悉的多态的思维方式入手介要从我们熟悉的多态的思维方式入手介绍程序对多态的模拟绍程序对多态的模拟 从设计新的类型的角度说明运算符重载从设计新的类型的角度说明运算符重载的意义的意义一个新的类型包括数据和运一个新的类型包括数据和运算方法算方法 运算符重载实质上也就是函数重载,属运算符重载实质上也就是函数重载,属静态多态性静态多态性 对应讲稿:第对应讲稿:
49、第8章章3-7页页79运算符重载运算符重载 这里只讲运算符重载的一般概念和基本这里只讲运算符重载的一般概念和基本语法,对一些特殊运算符的重载,如语法,对一些特殊运算符的重载,如,留到第留到第9章结合实例介绍会比较直观章结合实例介绍会比较直观 对应讲稿:第对应讲稿:第8章章8-29页页80动态多态性动态多态性 绑定的概念绑定的概念 以基类的指针指向派生类的对象,并希以基类的指针指向派生类的对象,并希望由此调用派生类的函数望由此调用派生类的函数静态绑定静态绑定不能实现,使用动态绑定。不能实现,使用动态绑定。对应讲稿:第对应讲稿:第8章章30-4281实验课安排实验课安排 实验七实验七 学习声明和使
50、用类的继承关系,声明派生类;学习声明和使用类的继承关系,声明派生类;熟悉不同继承方式下对基类成员的访问控制;熟悉不同继承方式下对基类成员的访问控制;学习利用虚基类解决二义性问题。学习利用虚基类解决二义性问题。实验八实验八 掌握运算符重载的方法;掌握运算符重载的方法;学习使用虚函数实现动态多态性。学习使用虚函数实现动态多态性。82小结小结 本章讲解时的关键在于以面向对象的现本章讲解时的关键在于以面向对象的现实意义引出语法规定,以程序模拟现实实意义引出语法规定,以程序模拟现实问题。问题。C+C+语言程序设计语言程序设计 教学法讲座教学法讲座(7)(7):数据结构与数据结构与STLSTL清华大学 郑