C++语言程序设计教案.docx
- 文档编号:30676379
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:58
- 大小:33.01KB
C++语言程序设计教案.docx
《C++语言程序设计教案.docx》由会员分享,可在线阅读,更多相关《C++语言程序设计教案.docx(58页珍藏版)》请在冰豆网上搜索。
C++语言程序设计教案
教案
课程名称:
《C++语言程序设计》
教员姓名:
潘俊杰
授课对象:
层次晋升中高级职称专业技术人员队别
审查人:
姓名时间2007年4月
主要内容:
一、教案题目:
《C++语言程序设计》(时间40学时)
二、教学目的:
《C++语言程序设计》是为总装部队科研试验技术干部晋升专业技术职务进行职前培训而开设的一门选修课。
通过该课程的学习,使参加学习的各级专业技术干部掌握面向对象程序设计的基本思想和C++程序设计知识,提高程序设计能力。
三、教学内容、重点
教学内容:
《C++语言程序设计》包括C++基础知识,函数,类与对象,C++程序结构,数组、指针与字符串,继承与多态,群体类,标准模板库,异常处理。
教学重点:
C++基础知识,函数,类与对象,C++程序结构,数组、指针与字符串,继承与多态。
四、教学方法
采用课堂讲授与模拟练习相结合。
基本概念和理论、基本操作方法及应用的课堂讲授占总学时的70%,个人动手实验操作、模拟练习占总学时的30%。
五、教学手段
多媒体课件、板书。
六、教学保障
多媒体教学系统。
教学过程
教学内容
第一章C++基础
1C++语言概述
C++语言的产生
●C++是从C语言发展演变而来的,首先是一个更好的C
●引入了类的机制,最初的C++被称为“带类的C”
●1983年正式取名为C++
●从1989年开始C++语言的标准化工作
●于1994年制定了ANSIC++标准草案
●于1998年11月被国际标准化组织(ISO)批准为国际标准,成为目前的C++
C++的特点
●全面兼容C
–它保持了C的简洁、高效和接近汇编语言等特点
–对C的类型系统进行了改革和扩充
–C++也支持面向过程的程序设计,不是一个纯正的面向对象的语言
●支持面向对象的方法
2基本数据类型和表达式
数据类型
—整型数据及取值范围
类型说明符位数数值范围
短整short16-32768~32767
基本int32-231~(231-1)
长整long32-231~(231-1)
无符号
unsignedshort160~65535
unsigned[int]320~(232-1)
unsignedlong320~(232-1)
数据类型
——字符型数据
(一)
●字符常量
–单引号括起来的一个字符,如:
'a','D','?
','$'
●字符变量
–用来存放字符常量
例:
charc1,c2;
c1='a';
c2='A';
●字符数据在内存中的存储形式
–以ASCII码存储,占1字节,用7个二进制位
数据类型
——字符型数据
(二)
●字符数据的使用方法
–字符数据和整型数据之间可以运算。
–字符数据与整型数据可以互相赋值。
●字符串常量
例:
"CHINA"
"a"
'a'
所以:
charc;
c="a";
数据类型
——布尔型数据
●布尔型变量的说明:
例:
boolflag;
●布尔型数据的取值:
只有false和true两个值
3数据的输入与输出
简单的输入、输出
●向标准输出设备(显示器)输出
例:
intx;
cout<<“x=“< ●从标准输入设备(键盘)输入 例: intx; cin>>x; 4算法的基本控制结构 •顺序结构 •分支结构 •循环结构 5自定义数据类型 枚举类型—enum ●只要将需要的变量值一一列举出来,便构成了一个枚举类型。 ●枚举类型的声明形式如下: enum枚举类型名{变量值列表}; 结构体——结构的声明 ●结构的概念 –结构是由不同数据类型的数据组成的集合体。 ●声明结构类型 struct结构名 { 数据类型成员名1; 数据类型成员名2; : 数据类型成员名n; }; 联合体 ●声明形式: union联合名 { 数据类型成员名1; 数据类型成员名2; : 数据类型成员名n; }; ●联合体类型变量说明的语法形式 联合名联合变量名; ●引用形式: 联合名.成员名 第二章函数 1函数的声明和调用 函数的声明 ●函数是面向对象程序设计中,对功能的抽象 ●函数声明的语法形式 类型标识符函数名(形式参数表) { 语句序列 } 函数的声明 ●形式参数表 ●函数的返回值 –由return语句给出,例如: return0 –无返回值的函数(void类型),不必写return语句。 函数的调用 ●调用前先声明函数原型: –在调用函数中,或程序文件中所有函数之外,按如下形式说明: 类型标识符被调用函数名(含类型说明的形参表); ●调用形式 函数名(实参列表) ●嵌套调用 –函数可以嵌套调用,但不允许嵌套定义。 ●递归调用 –函数直接或间接调用自身。 2内联函数 内联函数声明与使用 ●声明时使用关键字inline。 ●编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 ●注意: –内联函数体内不能有循环语句和switch语句。 –内联函数的声明必须出现在内联函数第一次被调用之前。 –对内联函数不能进行异常接口声明。 3内联函数声明与使用 ●声明时使用关键字inline。 ●编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销。 ●注意: –内联函数体内不能有循环语句和switch语句。 –内联函数的声明必须出现在内联函数第一次被调用之前。 –对内联函数不能进行异常接口声明。 4重载函数的声明 ●C++允许功能相近的函数在相同的作用域内以相同函数名声明,从而形成重载。 方便使用,便于记忆。 ●注意事项 ●重载函数的形参必须不同: 个数不同或类型不同。 ●编译程序将根据实参和形参的类型及个数的最佳匹配来选择调用哪一个函数。 5C++系统函数 ●C++的系统库中提供了几百个函数可供程序员使用。 例如: 求平方根函数(sprt)、求绝对值函数(abs)等。 ●使用系统函数时要包含相应的头文件。 例如: math.h或cmath 第三章 类与对象 本章主要内容 ●面向对象的思想 ●OOP的基本特点 ●类概念和声明 ●对象 ●构造函数 ●析构函数 ●内联成员函数 ●拷贝构造函数 ● ●一类概念和声明 类的声明形式 类是一种用户自定义类型,声明形式: class类名称 { public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员 } ●二对象 对象 ●类的对象是该类的某一特定实体,即类类型的变量。 ●声明形式: 类名对象名; ●例: ClockmyClock; 类中成员的访问方式 ●类中成员互访 –直接使用成员名 ●类外访问 –使用“对象名.成员名”方式访问public属性的成员 三构造函数 构造函数 ●构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。 ●在对象创建时由系统自动调用。 ●如果程序中未声明,则系统自动产生出一个默认形式的构造函数 ●允许为内联函数、重载函数、带默认形参值的函数 四析构函数 析构函数 ●完成对象被删除前的一些清理工作。 ●在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。 ●如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。 五内联成员函数 内联成员函数 ●为了提高运行时的效率,对于较简单的函数可以声明为内联形式。 ●内联函数体中不要有复杂结构(如循环语句和switch语句)。 ●在类中声明内联成员函数的方式: –将函数体放在类的声明中。 –使用inline关键字。 六拷贝构造函数 拷贝构造函数 拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。 class类名 {public: 类名(形参);//构造函数 类名(类名&对象名);//拷贝构造函数 ... }; 类名: : 类名(类名&对象名)//拷贝构造函数的实现 {函数体} 第四章 程序结构 主要内容 本章主要内容 ●作用域与可见性 ●对象的生存期 ●数据与函数 ●静态成员 ●共享数据的保护 ●友元 ●编译预处理命令 ●多文件结构和工程 一作用域与可见性 函数原形的作用域 ●函数原型中的参数,其作用域始于 "(",结束于")"。 ●例如,设有下列原型声明: doubleArea(doubleradius); 块作用域 ●在块中声明的标识符,其作用域自声明处起,限于块中,例如: voidfun(inta) {intb(a); cin>>b; if(b>0) { intc; ...... } } 类作用域 ●类作用域作用于特定的成员名。 ●类X的成员M具有类作用域,对M的访问方式如下: –如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员M。 –通过表达式x.M或者X: : M访问。 –通过表达式prt->M 文件作用域 ●不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。 可见性 ●可见性是从对标识符的引用的角度来谈的概念 ●可见性表示从内层作用域向外层作用域“看”时能看见什么。 ●如果标识在某处可见,则就可以在该处引用此标识符。 ●标识符应声明在先,引用在后。 ●如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。 ●对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。 同一作用域中的同名标识符 ●在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名。 ●重载的函数可以有相同的函数名。 二对象的生存期 对象的生存期 对象从产生到结束的这段时间就是它的生存期。 在对象生存期内,对象将保持它的值,直到被更新为止。 静态生存期 ●这种生存期与程序的运行期相同。 ●在文件作用域中声明的对象具有这种生存期。 ●在函数内部声明静态生存期对象,要冠以关键字static。 动态生存期 ●块作用域中声明的,没有用static修是的对象是动态生存期的对象(习惯称局部生存期对象)。 ●开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。 三数据与函数 数据与函数 ●数据存储在局部对象中,通过参数传递实现共享——函数间的参数传递。 ●数据存储在全局对象中。 ●将数据和使用数据的函数封装在类中。 四静态成员 静态成员 ●静态数据成员 –用关键字static声明 –该类的所有对象维护该成员的同一个拷贝 –必须在类外定义和初始化,用(: : )来指明所属的类。 ●静态成员函数 –类外代码可以使用类名和作用域操作符来调用静态成员函数。 –静态成员函数只能引用属于该类的静态数据成员或静态成员函数。 五共享数据的保护 常类型 常类型的对象必须进行初始化,而且不能被更新。 ●常引用: 被引用的对象不能被更新。 const类型说明符&引用名 ●常对象: 必须进行初始化,不能被更新。 类名const对象名 ●常数组: 数组元素不能被更新(下一章介绍)。 类型说明符const数组名[大小]... ●常指针: 指向常量的指针(下一章介绍)。 六友元 友元 ●友元是C++提供的一种破坏数据封装和数据隐藏的机制。 ●通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息。 ●可以使用友元函数和友元类。 ●为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元。 友元函数 ●友元函数是在类声明中由关键字friend修饰说明的非成员函数,在它的函数体中能够通过对象名访问private和protected成员 ●作用: 增加灵活性,使程序员可以在封装和快速性方面做合理选择。 ●访问对象中的成员必须通过对象名。 七编译预处理命令 编译预处理命令 ●#include包含指令 –将一个源文件嵌入到当前源文件中该点处。 –#include<文件名> ●按标准方式搜索,文件位于C++系统目录的include子目录下 –#include"文件名" ●首先在当前目录中搜索,若没有,再按标准方式搜索。 ●#define宏定义指令 –定义符号常量,很多情况下已被const定义语句取代。 –定义带参数宏,已被内联函数取代。 ●#undef –删除由#define定义的宏,使之不再起作用。 条件编译指令#if和#endif #if常量表达式 //当“常量表达式”非零时编译 程序正文 #endif ...... 八多文件结构和工程 多文件结构(例5-10) ●一个源程序可以划分为多个源文件: –类声明文件(.h文件) –类实现文件(.cpp文件) –类的使用文件(main()所在的.cpp文件) ●利用工程来组合各个文件。 第五章数组指针与字符串 本章主要内容 ●数组 ●指针 ●动态存储分配 ●指针与数组 ●指针与函数 ●字符串 一数组 数组的概念 数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 数组属于构造类型。 一维数组的声明与引用 ●一维数组的声明 类型说明符数组名[常量表达式]; 例如: inta[10]; 表示a为整型数组,有10个元素: a[0]...a[9] 二指针 指针变量的赋值运算 指针名=地址 ●“地址”中存放的数据类型与指针类型必须相符。 ●向指针变量赋的值必须是地址常量或变量,不能是普通整数。 但可以赋值为整数0,表示空指针。 ●指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsignedlongint型。 ●允许声明指向void类型的指针。 该指针可以被赋予任何类型对象的地址。 例: void*general; 三动态存储分配 动态申请内存操作符new new类型名T(初值列表) 功能: 在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。 结果值: 成功: T类型的指针,指向新分配的内存。 失败: 0(NULL) 释放内存操作符delete delete指针P 功能: 释放指针P所指向的内存。 P必须是new操作的返回值。 动态存储分配函数 ●void*malloc(size); 参数size: 欲分配的字节数 返回值: 成功,则返回void型指针。 失败,则返回空指针。 头文件: 动态内存释放函数 ●voidfree(void*memblock); 参数memblock: 指针,指向需释放的内存。 返回值: 无 头文件: 四指针与数组 指向数组元素的指针 ●声明与赋值 例: inta[10],*pa; pa=&a[0];或pa=a; ●通过指针引用数组元素 经过上述声明及赋值后: –*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i]. –a[i],*(pa+i),*(a+i),pa[i]都是等效的。 –不能写a++,因为a是数组首地址是常量。 五指针与函数 以指针作为函数参数 ●以地址方式传递数据,可以用来返回函数处理结果。 ●实参是数组名时形参可以是指针。 六字符串 用字符数组存储和处理字符串 字符串的输入/输出 ●方法 –逐个字符输入输出 –将整个字符串一次输入或输出 例: charc[]="China"; cout< ●注意 –输出字符不包括'\0' –输出字符串时,输出项是字符数组名,输出时遇到'\0'结束。 –输入多个字符串时,以空格分隔;输入单个字符串时其中不能有空格。 第六章继承与派生 本章主要内容 ●类的继承与派生 ●类成员的访问控制 ●单继承与多继承 ●派生类的构造、析构函数 ●类成员的标识与访问 一类的继承与派生 ●保持已有类的特性而构造新类的过程称为继承。 ●在已有类的基础上新增自己的特性而产生新类的过程称为派生。 ●被继承的已有类称为基类(或父类)。 ●派生出的新类称为派生类。 派生类的声明 class派生类名: 继承方式基类名 { 成员声明; } 继承方式 ●不同继承方式的影响主要体现在: –派生类成员对基类成员的访问权限 –通过派生类对象对基类成员的访问权限 ●三种继承方式 –公有继承 –私有继承 –保护继承 公有继承(public) ●基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。 ●派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 ●通过派生类的对象只能访问基类的public成员。 私有继承(private) ●基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。 ●派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 ●通过派生类的对象不能直接访问基类中的任何成员。 保护继承(protected) ●基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。 ●派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 ●通过派生类的对象不能直接访问基类中的任何成员 protected成员的特点与作用 ●对建立其所在类对象的模块来说,它与private成员的性质相同。 ●对于其派生类来说,它与public成员的性质相同。 ●既实现了数据隐藏,又方便继承,实现代码重用。 ●类成员的访问控制 ●单继承与多继承 ●基类与派生类的对应关系 ●单继承 ●派生类只从一个基类派生。 ●多继承 ●派生类从多个基类派生。 ●多重派生 ●由一个基类派生出多个不同的派生类。 ●多层派生 ●派生类又作为基类,继续派生新的类。 ●多继承时派生类的声明 ●class派生类名: 继承方式1基类名1, 继承方式2基类名2,... ●{ ●成员声明; ●} ●注意: 每一个“继承方式”,只用于限制对紧随其后之基类的继承。 二派生类的构造、析构函数 ●继承时的构造函数 ●基类的构造函数不被继承,派生类中需要声明自己的构造函数。 ●声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。 ●派生类的构造函数需要给基类的构造函数传递参数 ●单一继承时的构造函数 ●派生类名: : 派生类名(基类所需的形参,本类成员所需的形参): 基类名(参数表) ●{ ●本类成员初始化赋值语句; ●}; ●多继承时的构造函数 ●派生类名: : 派生类名(基类1形参,基类2形参,...基类n形参,本类形参): 基类名1(参数),基类名2(参数),...基类名n(参数) ●{ ●本类成员初始化赋值语句; ●}; ●派生类与基类的构造函数 ●当基类中声明有默认形式的构造函数或未声明构造函数时,派生类构造函数可以不向基类构造函数传递参数。 ●若基类中未声明构造函数,派生类中也可以不声明,全采用缺省形式构造函数。 ●当基类声明有带形参的构造函数时,派生类也应声明带形参的构造函数,并将参数传递给基类构造函数。 ●多继承且有内嵌对象时 的构造函数 ●派生类名: : 派生类名(基类1形参,基类2形参,...基类n形参,本类形参): 基类名1(参数),基类名2(参数),...基类名n(参数),对象数据成员的初始化 ●{ ●本类成员初始化赋值语句; ●}; ●构造函数的调用次序 ●1.调用基类构造函数,调用顺序按照它们被继承时声明的顺序(从左向右)。 ●2.调用成员对象的构造函数,调用顺序按照它们在类中声明的顺序。 ●3.派生类的构造函数体中的内容。 ●类成员的标识与访问 同名隐藏规则 当派生类与基类中有相同成员时: ●若未强行指名,则通过派生类对象使用的是派生类中的同名成员。 ●如要通过派生类对象访问基类中被覆盖的同名成员,应使用基类名限定。 二义性问题 ●在多继承时,基类与派生类之间,或基类之间出现同名成员时,将出现访问时的二义性(不确定性)——采用虚函数(第8章)或同名隐藏规则来解决。 ●当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。 二义性的解决方法 ●解决方法一: 用类名来限定 c1.A: : f()或c1.B: : f() ●解决方法二: 同名覆盖 在C中声明一个同名成员函数f(),f()再根据需要调用A: : f()或B: : f() 虚基类 ●虚基类的引入 –用于有共同基类的场合 ●声明 –以virtual修饰说明基类 例: classB1: virtualpublicB ●作用 –主要用来解决多继承时可能发生的对同一基类继承多次而产生的二义性问题. –为最远的派生类提供唯一的基类成员,而不重复产生多次拷贝 ●注意: –在第一级继承时就要将共同基类设计为虚基类。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 语言程序设计 教案