ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:23.53KB ,
资源ID:13431739      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13431739.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《C++面向对象程序设计》教案.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

《C++面向对象程序设计》教案.docx

1、C+面向对象程序设计教案面向对象程序设计课程教案课程编号:08051230课程名称:面向对象程序设计(Object-oriented Programming)学时:72学时,其中理论学时54,上机学时18 学分:3.5 开课部门:数学与计算机科学学院开课教研室:计算机科学开课教师:雷小园开课学期:第7学期 授课班级:04信计先修课程:C语言程序设计考核要求:考试,平时10,实验20,考试70使用教材:C+面向对象程序设计教程(第2版),陈维兴,清华大学出版社,2004年C+面向对象程序设计习题解答与实验指导,陈维兴,清华大学出版社,2004年教学目的与要求:面向对象程序设计是一门计算机及相关专

2、业的重要的专业基础课。本课程讲述C+语言面向对象的基本特性,包括类、对象、派生类、继承、运算符重载、多态性、虚函数、函数模板、类模板、输入输出、流类库、文件等,使学生掌握面向对象程序设计的基本概念和基本方法,能运用C+语言进行基本的面向对象程序设计。教学方法:采用板书讲解C+程序设计,再加以上机练习C+编程。第3章 类和对象3.1 类与对象的基本概念3.2 构造函数与析构函数例:点类 Pointclass Point private: int x,y; public: Point() ; Point(int xx, int yy) x=xx; y=yy; Point(Point &p) x=p

3、.x; y=p.y; int GetX() const return x; int GetY() const return y; void SetXY(int xx, int yy) x=xx; y=yy; void Show(); ; void Point:Show() coutX: x, Y: yendl; 例:人类 Personclass Person protected: char *name; int age; char sex; public: Person(char *n, int a, char s); Person() name = 0; age = 0; sex = ; P

4、erson( Person &p ); Person() delete name; void SetName(char *n); void SetAge(int a) age = a; void SetSex(int s) sex = s; char *GetName() const return name; int GetAge() const return age; char GetSex() const return sex; void Show(); #include person.h#include using namespace std;Person:Person(char *n,

5、 int a, char s) name = new charstrlen(n)+1; strcpy(name,n); age = a; sex = s;Person:Person(Person &p) name = new charstrlen(p.name)+1; strcpy(name,p.name); age = p.age; sex = p.sex; void Person:SetName(char *n) delete name; name = new charstrlen(n)+1; strcpy(name,n);void Person:Show() coutName: name

6、, Age: age, Sex: sex”操作符。 3、this指针C+为成员函数提供了一个名字为this的指针,这个指针称为自引用指针。每当通过一个对象调用一个成员函数时,系统就自动把这个this指针指向该对象。因此使用的数据成员就是该对象的数据成员。3.4 向函数传递对象1、使用对象作为函数参数2、使用对象指针作为函数参数3、使用对象引用作为函数参数3.5 静态成员1、静态数据成员 在一个类中,若将一个数据成员说明为static,这种成员称为静态数据成员。 与一般的数据成员不同,无论建立多少个类的对象,都只有一个静态数据的拷贝。从而实现了同一个类的不同对象之间的数据共享。 定义静态数据成员

7、的格式如下: static 数据类型 数据成员名;静态数据成员在该类定义之外被初始化。访问静态数据成员可以通过对象或指针来访问,也可以通过类名:来访问。2、静态成员函数 定义静态成员函数的格式如下:static 返回类型 静态成员函数名(参数表); 与静态数据成员类似,调用公有静态成员函数的一般格式有如下几种: 类名:静态成员函数名(实参表) 对象. 静态成员函数名(实参表) 对象指针-静态成员函数名(实参表)例:点类 Point(演示静态成员)class Point private: int x,y; static int count; public: Point(int xx=0, int

8、 yy=0) x=xx; y=yy; count+; Point(Point &p) x=p.x; y=p.y; count+; int GetX() const return x; int GetY() const return y; void SetXY(int xx, int yy) x=xx; y=yy; static int GetCount() return count; ; int Point:count=0;int main() Point a(100,200), b; couta.GetCount(); coutPoint:GetCount();3.6 友元1、友元函数友元函

9、数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。2、友元成员一个类的成员函数也可以作为另一个类的友元,这种成员函数不仅可以访问自己所在类对象中的所有成员,还可以访问friend声明语句所在类对象中的所有成员。3、友元类一个类也可以作为另一个类的友元。友元关系是单向的,不具有交换性。若类X是类Y的友元,类Y不一定是类X的友元。友元关系也不具有传递性。若类X是类Y的友元,Y是类Z的友元,类X不一定是类Z的友元。例:点类 Point(演示友元)class Point private: int x,y; static int co

10、unt; public: Point(int xx=0, int yy=0) x=xx; y=yy; int GetX() const return x; int GetY() const return y; void SetXY(int xx, int yy) x=xx; y=yy; friend double Dist(Point p1, Point p2); friend double Dist(Point p1, Point p2); double x,y; x=p1.x-p2.x; y=p1.y-p2.y; return sqrt(x*x+y*y);classint main() P

11、oint a(100,200), b(300,400); cout两点间的距离为:Dist(p1,p2)=0 ? r : 0); void SetValue(int x, int y, double r) center.SetXY(x,y); SetRadius(r); double Area(); void Show(); const double PI=3.14159; inline double Circle:Area() return PI * radius * radius; void Circle:Show() cout圆心为: center.Show();cout半径为: =0

12、? r : 0); void SetValue(int x, int y, double r) SetXY(x,y); SetRadius(r); double Area(); void Show(); const double PI=3.14159; inline double Circle:Area() return PI * radius * radius; void Circle:Show() cout圆心为: Point:Show();cout半径为: radius;关于基类和派生类的几点说明1、派生类继承了它的所有基类中除构造函数和析构函数之外的所有成员。2、在派生类中成员按访问属

13、性划分为四种:不可访问的成员、私有成员、保护成员、公有成员。3、对从基类继承下来的成员初始化工作是通过调用基类的构造函数来完成的,调用方法是在派生类的构造函数中用初始化列表。4、如果在派生类的构造函数省略了基类的初始化列表,则将调用基类的缺省构造函数。5、如果基类定义了带有参数的构造函数时,派生类就应当定义构造函数,以便显式地调用基类的构造函数。6、如果派生类定义了与基类同名的新数据成员或成员函数,则此派生类的成员就覆盖了基类的同名成员,直接使用成员名只能访问到派生类的成员。7、在同名覆盖的情况下,可以使用基类名+作用域分辨符来访问基类的同名成员。8、如果派生类和基类的某个成员函数重名,但参数

14、表不同,仍然属于覆盖,不属于重载。9、对派生类的对象,构造函数的执行过程是:先调用基类的构造函数(按它们被继承时声明的顺序),再调用内嵌对象成员的构造函数(按内嵌对象声明的顺序),最后执行自己的构造函数体中的内容。10、析构函数的调用次序正好和构造函数的调用次序相反。例:学生类 Student/student.h#include person.hclass Student: public Person protected: char *Department; int Number; public: Student() Department = 0; Number = 0; Student(ch

15、ar *, int, char, char *, int); Student(Student &stu); Student() delete Department; void SetDep(char*); void SetNum(int num) Number = num; char *GetDep() const return Department; int GetNum() const return Number; void Show(); ; /student.cpp#include student.h#include using namespace std;Student:Studen

16、t(char *name,int age,char sex,char *dep,int num) : Person(name, age, sex) Department = new charstrlen(dep)+1; strcpy(Department, dep); Number = num;Student:Student(Student &stu): Person(stu) Department = new charstrlen(stu.Department)+1; strcpy(Department, stu.Department); Number = stu.Number; void

17、Student:SetDep(char *dep) delete Department; Department = new charstrlen(dep)+1; strcpy(Department, dep);void Student:Show() Person:Show(); coutDepartment: Department, Number: Numberendl;4.3 调整基类成员在派生类中访问属性的其他方法4.4 多重继承例1:X和Y是基类,Z从X和Y派生class X public: int b; X(int k) b=k; ;class Y public: int c; Y(i

18、nt k) c=k; ;class Z: public X, public Y public: int d; Z(int i,int j,int k):X(i),Y(j) d=k; 例2:X和Y都从W派生而来class W public: int a; W(int k) d=k; ;class X: public W public: int b; X(int i, int k): W(i) b=k; ;class Y: public W public: int c; Y(int i, int k): W(i) c=k; ;class Z: public X, public Y public:

19、int d; Z(int i, int j, int k, int l): X(i,j),Y(i,k) d=l; int main() Z t(10,20,30,40); coutt.X:at.Y:at.bt.ct.dendl;例3:将W做为X和Y的虚基类class W public: int a; W(int k) a=k; ;class X: virtual public W public: int b; X(int i, int k): W(i) b=k; ;class Y: virtual public W public: int c; Y(int i, int k): W(i) c=

20、k; ;class Z: public X, public Y public: int d; Z(int i, int j, int k, int l): W(i),X(i,j),Y(i,k) d=l; int main() Z t(10,20,30,40); coutt.at.bt.ct.dendl;在使用虚基类机制时应该注意以下几点:(1) 如果在虚基类中定义有带形参的构造函数,并且没有定义缺省形式的构造函数,则整个继承结构中,所有直接或间接的派生类都必须在构造函数的成员初始化表中列出对虚基类构造函数的调用,以初始化在虚基类中定义的数据成员。(2) 建立一个对象时,如果这个对象中含有从虚基

21、类继承来的成员,则虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的。该派生类的其他基类对虚基类构造函数的调用都自动被忽略。(3) 若同一层次中同时包含虚基类和非虚基类,应先调用虚基类的构造函数,再调用非虚基类的构造函数,最后调用派生类构造函数;(4) 对于多个虚基类,构造函数的执行顺序仍然是先左后右,自上而下;(5)对于非虚基类,构造函数的执行顺序仍是先左后右,自上而下;(6) 若虚基类由非虚基类派生而来,则仍然先调用基类构造函数,再调用派生类的构造函数。4.5 赋值兼容规则所谓赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。附:线性表顺序表c

22、lass SeqList private: int *data; int size; int MaxSize; public: SeqList(int sz=100); SeqList() delete data; int Length() const return size; bool IsEmpty() const return size=0; void Insert(const int &x, int k); void Delete(int k); int GetData(int k) const; int Find(const int &x) const; void Show() co

23、nst; ; SeqList:SeqList(int sz) MaxSize=sz; data=new intMaxSize; size=0; void SeqList:Insert(const int &x, int k) if( ksize+1 ) cerr越界出错; exit(1); if(size=MaxSize) cerr=k-1; i-) datai+1=datai; datak-1=x; size+; void SeqList:Delete(int k) if(size=0) cerr顺序表空; exit(1); if( ksize ) cerr越界出错; exit(1); for(int i=k; isize; i+) datai-1=datai; size-; int SeqList:GetData(int k) const if( ksize ) cerr越界出错; exit(1); return datak-1; int SeqList:Find(const int &x)

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2