c++教案.docx
《c++教案.docx》由会员分享,可在线阅读,更多相关《c++教案.docx(39页珍藏版)》请在冰豆网上搜索。
c++教案
成绩评定方式:
期末闭卷考试:
70%
平时成绩:
30%
平时成绩的组成:
22分,扣分项目,上课或实验缺席1次3分,迟到1分,不交作业1次扣3分,不做课内实验,不提交课内实验报告扣12分,严禁抄袭,发现扣12分
8分,加分项目,完成老师布置的课后实验或用C++独立完成有一定规模的程序
12大体和C的内容差不多,比较简单,主要是复习。
1,2章C++简介C++基础
1入门
程序的开发过程
阶段
编程工具
复习:
小和尚程序
求pi,pi=16arctan(1/5)-4arctan(1/239),
arctan(x)=x-x3/3+x5/5-x7/7+…
简单程序的C和C++的比较
1.first:
helloworld
firstC++
firstC
CanyouseethemeaningofeverywordWhatdoyouthinkthedifferenceofCandCplus
2.aexampleofCpluswithclass
Doyouknowtheprogram
Fromtheexample,doyouthinktheC++isbetterthanCTryperformingtheaimbyC
用结构化的方法,BasketballPlayer。
推荐开发工具,学习方法和参考资料
网络,电子书,看程序,写程序,msdn,论坛
初级:
C++语言程序设计教程Deitel
C++程序设计语言Stroustrup
中级:
C++编程思想Eckel
C++语言设计与演化Stroustrup
数据结构、算法与应用:
C++语言描述Sahni
高级:
C++核心:
软件工程方法Shtern
大型C++软件设计Lakos
作业:
第一章课后作业,阅读第一章
预习第二章
2C++中的C
C++的产生
orientprocedure,orientobject
whofoundedtheC++BjarneStroustrup
部分语法元素
c++
1.关键字
2.标示符:
变量,对象,函数,类的名字,
注意命名标示符规则
3.基本数据类型:
注意各个数据类型的表示范围
WhatresultoftheprogramWhy
4.常量
整型:
十进制,八进制,十六进制
实型:
一般形式,指数形式(科学计数),后缀
字符型:
单引号‘A’,‘&’‘7’
注意
不可见字符
转义字符:
用八进制,十六进制ASCII码来表示字符/456/x61
一些预定义的字符常量:
\a,\n,\t,\r\\\’\’’
字符串:
“helloworld”
注意:
“A”和‘A’的区别
布尔常量:
truefalse
注意常量的各种写法
5.变量
变量的声明:
声明的形式类型名字初始值inta=3;intb(5);
注意:
使用之前必须声明
6.符号常量
给常量取个名字。
WhyTheaim
HowConstfloatpi=;
注意:
在声明时一定要赋初值
7.运算符与算术表达式
参考PPT
a)算术
b)赋值
c)逗号
d)逻辑
e)条件:
唯一的三元运算符(a>b):
a,b;
f)sizeof:
用于计算某种类型的对象在内存中的字节数
g)位:
与或异或移位取反
注意:
运算符的优先级
8.表达式中数据类型的转换
隐含转换:
降低的转成高的
显示转换:
方法int(a),(int)a;
C++中的输入输出
方法coutcin
cout<<”hello\n”;cin>>a;cin>>a>>b;
简单的格式控制endsendl“\n”
输出十六进制hexoctdec
设置精度宽度Setprecisionsetw
注意:
头文件iomanip
程序结构
顺序选择循环
程序流程图符号作用
1.选择结构
WhatfunctionofswitchTryingmodifytheprogram,makeitrunmoretimes.
WriteaprogramtodecideyourbodyHeightweight
2.循环结构
whilefordo-while
while
Canyousolvetheproblemwithwhileword
For
3.其他有用的控制语句
break
continue
goto
自定义数据类型
1.typedef:
用于将已有的类型取个新的名字。
What
How:
typedefintnatural;
naturali1,i2;
2.枚举enum
what:
将需要的变量值一一列出来,枚举变量只能取列表中的值
how:
enumweekday{sun,mon,tue,wed,thu,fri,sat};
Conclusionitisalistofsomerelatedconsts
Attention:
typetransmustbedowhengiveaenumvarianttoaintvariant
3.结构体
what:
combingdifferentdatatypetoaentry.
How:
Modifytheprogramtoevaluateyourbodyafterclass
4.联合体
what:
sameasstruct,butdiffenrencesharesamespace.
How:
作业:
练习题:
3大体和C的内容差不多,主要是复习,同时强调C++中不一样的地方。
3章函数
whatfunctionWhataim
Canyougiveaexamplewithfunction
有关函数的术语
定义
声明
调用
canyouseeeverypartofafunction
Doyouthinkwhatshouldbecaredwhendefineanduseafunction
函数举例和函数的作用
Doyouthinkfunctionsisuseful
Whatfeeldoyouwiththis
Algorithmismoreimportantthanlanguage
Sometechniquesinpractice
Canyoutellmethemeanofusingfunction
Decomposeabigproblemintoseverallittlemodules
Improvethereadabilityofprograms
Makingcomplexitytosimpleness
Writeafunctiontoevaluateyourbodyafterclass
Afterclass:
写一个和计算机玩石头剪刀布的程序。
统计100局的胜负比例
Conclusion:
Functionsisveryveryveryimportant,itisthebaseoflargeprograms!
!
Buthowtodesignsomefunctionstosolveaproblemisnotasimplework,itneedyourexperimentsandtechniques,soyoushouldpracticemore!
!
函数的嵌套和递归调用
1.函数调用的执行过程
调用
返回
2.嵌套调用
函数中又调用其他函数
3.递归调用
函数中又调用自己
why现实中有些问题具有递归性,用递归调用解决非常简单明。
注意:
递归函数中必须要有退出的条件
howfellwithrecursion
Theabilityofanalyzeismoreimportantthanlanguage
Conclusion:
Recursionisaverypowertoolforsomeproblems.
习题
Afterclass:
Read汉诺塔问题
函数的参数传递
1.有关参数的术语
形参
实参
不改变实参的调用,传值调用
改变实参的调用,传地址调用
引用:
变量的别名
what参数传递
howInt&a=b;
注意:
使用引用时应注意的问题:
初始化
引用不能改为指向其他对象
afterclass:
Ifnoref,howtoimplytheaddresscallWriteaprogram
Howfeeltoref
Conclusion:
Refisagoodthing
内联函数
inline
和普通函数的区别:
编译时在调用处用函数体进行替换,节省了参数传递、控制转移等开销
默认形参值
whatTomoresimple
函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。
C++
注意:
默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。
调用出现在函数体实现之前时,默认形参值必须在函数原形中给出;而当调用出现在函数体实现之后时,默认形参值需在函数实现时给出。
Thinking:
whatshouldbecarefultodefaultparameter
函数重载
在C中,两个函数可以有相同的名字吗
C++中,允许
注意:
编译器怎样区别两个同名函数
重载的函数必须有去区别用什么来区别
形参的数量和类型
thinking:
whataimofreloadfunctionToclearprogram
使用系统函数
数学函数
文件操作函数
进程函数
注意:
需要包含对应的头文件
帮助系统的作用
作业:
练习题:
开始学习面向对象的内容,感受C++中不同于C的性质
4是面向对象的内容,应重点学习
4章类和对象
面向对象的特点:
将数据和行为集成在一起,以描述客观世界的自然方式去编程
面向对象的三大性质
封装:
将抽象出的数据成员、代码成员相结合,将它们视为一个整体。
继承:
是C++中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。
今后学习的重点,专门一章
多态:
多态性是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为,例几何形状绘图多边形椭圆今后学习的重点,专门一章
类和对象
定义
类:
类是对逻辑上相关的函数与数据的封装,是对问题的抽象描述。
类:
类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。
对象:
类的对象是该类的某一特定实体,即类类型的变量。
C++中的实现:
HowtodefineaclassGram
类的声明
class类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
};{“888”,”姚明”,”男”}{X=xx;Y=yy;}{returnX;}{returnY;}{returnlen;}pp
note:
头文件的作用
补充:
作业:
练习题:
....
}
}
类作用域
类的成员在类的内部都是有效的。
文件作用域
不在前述各个作用域中出现的声明,具有文件作用域,这样声明的标识符的作用域开始于声明点,结束于文件尾。
(全局变量)
可见性
程序运行到某一点,能够引用到的标识符,就是该处可见的标识符。
Attention:
标识符应声明在先,引用在后。
如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。
对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。
(强龙难压地头蛇)
生存期
静态生存期
这种生存期与程序的运行期相同。
在文件作用域中声明的对象具有这种生存期。
(全局变量)
在函数内部声明静态生存期对象,要冠以关键字static。
(静态局部变量)
动态生存期
块作用域中声明的,没有用static修是的对象是动态生存期的对象(普通的局部变量)。
开始于程序执行到声明点时,结束于命名该标识符的作用域结束处。
对象的可见性和生存期和变量是一样的。
类的静态成员
静态数据成员
Question:
如何来表示类所共有的数据
计数问题
评估身体的标准
Thinking:
类和对象的关系,数据成员是如何来存放的
Define:
描述类的所有对象共同特征的一个数据项,对该类的任何对象实例,它的值是相同的
该类的所有对象维护该成员的同一个拷贝
How:
用关键字static声明
必须在类外定义和初始化,用(:
:
)来指明所属的类。
Attention:
静态数据成员的初始化
如何访问静态数据成员通过对象名,语意上不够直观。
静态函数成员
Question:
可以不通过对象名来访问静态数据成员吗语意上更直观。
如果没有创建对象呢
Thinking:
Point:
:
GetC();no,对普通函数成员的调用必须通过对象名。
Define:
静态函数成员属于整个类的
Characteristic:
公有的静态函数成员,即可以通过对象名调用,也可以通过类名调用
静态函数成员中只能直接访问类的静态成员,不可直接访问非静态成员(why)
因为非静态成员必须属于某个对象,而通过类名访问时并没有指明具体的对象。
classA
{
public:
staticvoidf(Aa);
private:
intx;
};
voidA:
:
f(Aa)
{
cout<private:
intx,y;
};
Aconsta(3,4);*.cpp
多文件结构
Define:
对复杂的程序,通常由多个文件组成。
如:
类的声明:
头文件
类的定义:
cpp文件
主程序:
cpp文件
How:
Attention:
类的声明和内联函数需要在使用它的每个编译单元(CPP文件)中给出完全一致的实现和声明。
通常用#include来处理这个问题。
#include
<>和””区别<>默认路径。
“”当前路径。
外部变量和外部函数
Question:
一个文件中定义的变量,可以被另外一个文件使用吗
这个功能有用吗
1.外部变量
Define:
具有文件作用域的变量
Characteristic:
其他文件也可以使用
How:
{1,1,1}{1,1}{1,2,3}{{1,2,3}{4,5,6}{1,2,3,4,5,6}6.1.46.2.9;
p->x;
p->getx();
1.对象指针中的高级问题
this指针
隐含于每一个类的成员函数中的特殊指针(包括构造和析构函数),指向正在被成员函数操作的对象(发出调用的对象)。
作用
Pointp(intx,inty);
(后面的可以不讲,自学)
指向类的非静态成员指针
指向类的数据成员的指针
intPoint:
:
*p;
p指可以指向Point的整形数据成员,p=&Point:
:
x;
Pointa;
a.(*p);
指向类的函数成员的指针
int(Point:
:
*p)();
p指可以指向Point的int()样式的函数成员,
注意:
通过该方式只有访问属性为公有才能被访问
初始化的方式。
p=&Point:
:
x;p=Point:
:
Getx();
访问方式,必须通过对象(p1).*p;(p1.*p)()
这些功能实际用途并不大。
2.指向类的静态成员的指针
类的静态成员的特点:
类的对象共有
在定义类的时候分配空间,空间固定
所以可以象普通变量一样使用指针访问类的静态成员
intPoint:
:
countP=0;HowtocontrolthischangingByinherientmethod
classC:
publicA
{
};
public:
类的继承方式,还可以是private和protected
public
基类的成员的访问属性在派生类中保持不变。
Private
基类的成员都以private身份出现在派生类中。
protected
基类的公有和保护成员都以protected身份出现在派生类中,基类的私有成员仍然已私有身份出现在派生类中。
Question:
tellmewecanaccesswhichmemberoutofnewclassondifferentinherentmethods
Thinking:
从派生类的外部来看,私有继承和保护继承有区别吗
没有
2派生类继承自基类的成员,派生类(派生类内的成员函数)对他们的访问有什么限制
访问规则:
派生类可以访问基类的保护和公有成员,但是不能访问基类的私有成员,和继承方式无关。
Trying
Thinking:
私有继承和保护继承方式究竟有什么区别
当利用派生类派生新的类的时候会体现出他们的不同Why
派生方式总结
无论那种方式,派生类中都不能直接访问基类的私有成员
无论那种方式,派生类中都可以直接访问基类的保护成员和公有成员
通过派生类的对象只可以访问基类的公有成员,但要求采用公有继承的方式产生派生类
类型兼容规则
Q:
派生类的对象可以赋值给基类对象吗
基类对象可以赋值给派生类的对象吗
规则:
一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。
(why)
具体表现在:
派生类的对象可以被赋值给基类对象。
派生类的对象可以初始化基类的引用。
指向基类的指针也可以指向派生类。
注意:
在替代之后,通过基类对象名、指针只能使用派生类中从基类继承的成员
trying
用途:
函数处理,参数传递
程序的缺点,没有输出派生类的成员内容
如何完成这个目标:
利用多态性
注意:
类型兼容是实现多态的基础
派生类的构造函数和析构函数
为什么要单独的讲解构造函数和析构函数
构造函数
如何给继承自基类的数据成员赋初值
派生类的构造函数的新任务:
除了完成自己的数据成员的初始化,同时还要完成继承自基类的数据成员的初始化。
想一想:
这一点和我们原来学习过的哪种情况比较象,是如何处理的
为什么直接赋值不完全可行
初始化列表
单继承的情况
派生类名:
:
派生类名(基类所需的形参,本类成员所需的形参):
基类名(参数表)
{
本类成员初始化赋值语句;
};
多继承的情况
注意:
一定要想到有对象被创建时就必然会调用构造函数或拷贝构造函数,那么就要想想调用的形式匹配不匹配(函数的形参类型和数量)
既有基类又有内嵌类的情况
注意:
调用基类和内嵌类构造函数的顺序,先基类,根据他们在派生类定义时申明派生的顺序;后内嵌,根据他们在派生类中定义的顺序。
Thinking:
为什么没有显式调用B3的构造函数
拷贝构造函数
同理:
派生类的拷贝构造函数不但要完成自身数据的拷贝构造,还要完成基类数据的拷贝构造。
方法:
初始化列表
形式:
C:
:
C(C&c1):
B(c1)
{}
Thinking:
拷贝构造函数的参数
基类的拷贝构造函数的传递的实参是什么派生类对象。
Whyisitreasonable
析构函数
rethinking:
析构函数的作用,什么时候被调用
派生类消亡时如何清理基类的数据成员
最好的办法:
调用基类的析构函数
析构函数不需要显式调用,都是自动调用的,why
因为不需要参数。
注意:
当派生类消亡时,会自动调用他的基类和内嵌类的析构函数,
他们的调用顺序,和构造函数的调用顺序相反
构造和析构.cpp(单继承)
派生类成员的标识与访问
作用域分辨
thinking:
在派生类中能否定义和基类中名字相同的成员(数据成员和函数成员)
能
术语:
同名覆盖
在派生类中如何引用继承自基类的同名成员
能引用,但是必须加类作用域运算符。
通过派生类的对象如何引用继承自基类的同名成员
1公有2加类作用域运算符
注意:
多继承中可能存在的二义性问题。
两个基类有相同名字的成员,访问时必须指出是哪个基类的成员。
一个可能会发生的情况:
当派生类从多个基类派生,而这些基类又从同一个基类派生,则在访问此共同基类中的成员时,将产生二义性——采用虚基类来解决。
共同基类的类图。
派生类的数据分析。
分析程序:
classB
{public:
intb;
}
classB1:
publicB
{
private:
intb1;
}
classB2:
publicB
{
private:
intb2;
};
classC:
publicB1,publicB2
{
public:
intf();
private:
intd;
}
p230
虚基类
上面的例子中,C类从两个方向继承了B类的成员。
这样产生了两个不足:
1.C需要两份B类成员的拷贝(浪费空间,维护困难)
2.造成C类中不能直接访问B类成员(二义性问题)
虚基类用来解决这类问题
Howtodo:
classB1:
virtualpublicB
virtual用来说明B是虚基类,声明了虚基类之后,虚基类的成员在进一步派生过程中和派生类一起维护同一个内存数据拷贝。
canyougiveaproveforthepoint
Sizeof
在人员管理中的应用
销售人员经理销售经理
虚基类及其派生类的构造函数(难点)
当虚基类只有带参数的构造函数时该如何写程序
#include
usingnamecpacestd;
classB0{nV=n;}{cout<<"MemberofB0"<动态绑定.cpp
8.2.2用来说明虚析构函数的必要性的例子.cpp
#include
usingnamespac