《C语言面向对象程序设计.ppt》由会员分享,可在线阅读,更多相关《C语言面向对象程序设计.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象程序设计面向对象程序设计 C+程序设计语言程序设计语言主讲:陈泽琳主讲:陈泽琳面向对象程序设计面向对象程序设计学时安排:学时安排:上课学时:上课学时:24 上机学时:上机学时:16参考资料:参考资料:(美)H.M.Deitel等著,薛万鹏等译,“C+程序设计教程”郑莉等编著,“C+语言程序设计”钱能主编,“C+程序设计教程”刘路放编著,“Visual C+与面向对象程序设计教程”杜建成等编著,“C+简明教程”.面向对象程序设计面向对象程序设计课程学习的目标:课程学习的目标:学习学习C+程序设计语言,程序设计语言,掌握面向对象程序设计方法。掌握面向对象程序设计方法。课程学习的要求:课程学
2、习的要求:预习,通过例子了解概念,编程上机实践。预习,通过例子了解概念,编程上机实践。面向对象程序设计面向对象程序设计课程大纲:课程大纲:1.类类(Class)2.构造函数和析构函数构造函数和析构函数(Constructor&Destructor)3.静态成员和友元静态成员和友元(Static Member&Friends)4.继承与多态性继承与多态性(Inheritance&Polymorphism)5.运算符重载运算符重载(Operator Overloading)6.I/O流与文件流与文件(I/O Stream&File)7.模板(模板(Template)、异常处理)、异常处理8.MFC
3、类库及程序框架类库及程序框架9.面向对象程序设计(面向对象程序设计(Object-oriented programming)面向对象程序设计面向对象程序设计C程序复习程序复习 (函数、参数、指针、引用、执行过程与程序)(函数、参数、指针、引用、执行过程与程序)讲课内容的一点说明讲课内容的一点说明:书的内容写的很细书的内容写的很细,讲课时先讲主要内容讲课时先讲主要内容,通过例子理解通过例子理解,在此过程中主要学习编程序在此过程中主要学习编程序,最后再补充最后再补充C+C+的细节规则。的细节规则。课件中的约定课件中的约定:基础内容基础内容重点内容重点内容*难点内容难点内容*需要注意的内容需要注意的
4、内容#应多练习的内容应多练习的内容#面向对象程序设计面向对象程序设计1.类类(class)1.1 类的概念类的概念面向对象程序设计面向对象程序设计问题问题:(例例1-1)编写一个时钟的程序,程序可以设置时、分、秒,编写一个时钟的程序,程序可以设置时、分、秒,可以判断设置的时间是否合理(时:可以判断设置的时间是否合理(时:0-23,分:,分:0-59,秒:秒:0-59),显示时间。),显示时间。什么是类什么是类?类是一种用户定义的数据类型类是一种用户定义的数据类型面向对象程序设计面向对象程序设计C语言程序(结构化程序设计方法):#include struct Time int hour;int
5、minute;int second;struct Time standard_time;main()set_time(18,20,30);show_time();void set_time(int h,int m,int s)standard_time.hour=(h=0&h=0&m=0&s 60)?s:0;void show_time()cout standard_time.hour:standard_time.minute:standard_time.secondendl;面向对象程序设计面向对象程序设计C+语言程序(面向对象程序设计)#include class Time private
6、:int hour;int minute;int second;public:void set_time(int,int,int);void show_time();void Time:set_time(int h,int m,int s)hour=(h=0&h=0&m=0&s 60)?s:0;void Time:show_time()cout hour:minute:secondendl;面向对象程序设计面向对象程序设计Time standard_time;main()standard_time.set_time(18,20,30);standard_time.show_time();看上去
7、只是写法不同,实际上在面向对象程序设计中,class,set_time(),show_time()是一个整体,是可以独立于main()主函数,也可以看成是对象的描述(注意这里的对象与后面要讲的对象一词意思不同,以后会详细介绍),即面向对象。而结构化程序设计中,只能将问题划分为一个个函数模块,哪些函数模块可以描述一个子问题或一个对象,程序中无法表示。因此以上两个程序是有本质区别的,面向对象程序设计可以将描述完整的子问题提供给他人,同时还能保护自己的程序不被他人乱改,多个面向对象子程序还可以象搭积木一样组合成大的面向对象程序,程序设计可以象生产汽车标准零件一样形成大规模生产,而这些在结构化程序设计
8、中都很难做到。面向对象程序设计面向对象程序设计为什么用类为什么用类:可以实现面向对象的程序设计可以实现面向对象的程序设计 即代码可以重用并受到保护即代码可以重用并受到保护类是实现面向对象程序设计的基本工具类是实现面向对象程序设计的基本工具下面我们一步步地介绍关于类的定义、用类进行下面我们一步步地介绍关于类的定义、用类进行面向对象程序设计的方法面向对象程序设计的方法面向对象程序设计面向对象程序设计 class 类名类名 数据成员数据成员(data members);.成员函数成员函数(member functions);类的定义类的定义:面向对象程序设计面向对象程序设计class 类名类名 pu
9、blic:公有段成员公有段成员;protected:保护段成员保护段成员;private:私有段成员私有段成员;;面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计说明:说明:1.类名的第一个字母一般大写类名的第一个字母一般大写;2.无论是数据成员无论是数据成员,还是成员函数还是成员函数,都可用三个访问控制都可用三个访问控制 关键字说明关键字说明:public、protected、private;3.默认情况是默认情况是private;4.说明为说明为private的数据成员的数据成员,其他对象不可访问的其他对象不可访问的;5.类是一种类型的定义,不分配存储空间;类是一种类型的定
10、义,不分配存储空间;面向对象程序设计面向对象程序设计再看一个例子:(例再看一个例子:(例1-2)描述人的信息:姓名、出生日、籍贯等描述人的信息:姓名、出生日、籍贯等 其成员函数有:设置姓名、出生日、籍贯等;其成员函数有:设置姓名、出生日、籍贯等;显示姓名、出生日、籍贯等显示姓名、出生日、籍贯等如要增加人的其他信息,学历、党派等,可以在类中如要增加人的其他信息,学历、党派等,可以在类中增加这些数据成员;还可以增加处理增加这些数据成员;还可以增加处理这些数据成员的成员函数这些数据成员的成员函数面向对象程序设计面向对象程序设计class Human public:Human();display();
11、private:char name10;struct int year;int month;int date;birthday;char history20;面向对象程序设计面向对象程序设计有成员函数和无成员函数有成员函数和无成员函数;成员的隐蔽和成员的公开成员的隐蔽和成员的公开;类与结构的区别类与结构的区别:面向对象程序设计面向对象程序设计如何定义类成员如何定义类成员:数据成员;成员函数的声明:数据成员;成员函数的声明声明(或说明)声明(或说明)定义定义说明说明:1.所有类定义中声明的成员函数都要定义其成员函数的实现所有类定义中声明的成员函数都要定义其成员函数的实现;2.在类中定义成员函数在
12、类中定义成员函数,默认为内联函数默认为内联函数;(小函数小函数,执行效率高执行效率高);3.在类之外定义成员函数在类之外定义成员函数,函数名必须为函数名必须为 类名类名:成员函数名成员函数名()4.非成员函数的全称为非成员函数的全称为 :函数名函数名 (不会引起出错时可省略不会引起出错时可省略:)1.2 类成员的定义类成员的定义:称为作用域运算符称为作用域运算符面向对象程序设计面向对象程序设计例1-3(在类的内部定义成员函数)#include class Time public:void set_time(int h,int m,int s)hour=(h=0&h=0&m=0&s 60)?s:
13、0;void show_time()cout hour:minute:secondendl;protected:int hour;int minute;int second;面向对象程序设计面向对象程序设计(在类的外部定义成员函数)#include class Time public:void set_time(int,int,int);void show_time();protected:int hour;int minute;int second;void Time:set_time(int h,int m,int s)hour=(h=0&h=0&m=0&s 60)?s:0;void Ti
14、me:show_time()cout hour:minute:secondendl;面向对象程序设计面向对象程序设计类成员的保护类成员的保护:(即对象成员的访问限制)(即对象成员的访问限制)类成员为public,则任何函数可以访问,提供给外部的接口;为protected,则自己类的成员函数 和派生类的成员函数可以访问;为private,则只能被自己类的成员函数访问。注:访问包括赋值和引用,a.birthday.year=1998;cout a.name成员访问说明符:成员访问说明符:public:、:、protected:、:、private:面向对象程序设计面向对象程序设计 除了全局变量赋初
15、值除了全局变量赋初值,C及及C+的变量访问的变量访问都是在函数中完成的都是在函数中完成的 类的数据成员的访问也是在成员函数或类的数据成员的访问也是在成员函数或一般函数中完成的一般函数中完成的(一般函数只能访问一般函数只能访问public数据数据)函数中访问数据(类的数据成员)函数中访问数据(类的数据成员)函数调用函数函数调用函数面向对象程序设计面向对象程序设计例例1-4class Test public:void putpuba(int);int puba;protected:void putproa(int);int proa;private:void putpria(int);int pr
16、ia;面向对象程序设计面向对象程序设计void Test:putpuba(int a)puba=a;proa=a;pria=a;cout in putpuba()endl;cout puba is puba;cout proa is proa;cout pria is pria;endl;/类成员函数可以访问自己的保护成员和私有成员putproa(a+1);putpria(a+2);cout end of putpuba()endl;面向对象程序设计面向对象程序设计void Test:putproa(int a)puba=a;proa=a;pria=a;cout in putproa()end
17、l;cout puba is puba;cout proa is proa;cout pria is pria;endl;/访问自己的私有成员putpria(a+3);coutend of putproa()endl;面向对象程序设计面向对象程序设计void Test:putpria(int a)puba=a;proa=a;pria=a;cout in putpria()endl;cout puba is puba;cout proa is proa;cout pria is pria;endl;/访问自己的保护成员 putproa()中的putpria()与下一函数调用/只能执行一个,否则循
18、环调用/putproa(a+1);coutend of putpria()endl;面向对象程序设计面向对象程序设计void main()int a=1,b=2,c=3;Test obj;obj.puba=10;cout in main(),puba=obj.puba endl;/obj.proa=20;error:proa is protected member/obj.pria=30;error:pria is private memberobj.putpuba(a);/obj.putproa(b);error:putproa()is protected member/obj.putpri
19、a(c);error:putpria()is private membercout endendl;面向对象程序设计面向对象程序设计 类定义的类定义的public段是类的对外接口段是类的对外接口,可以被外部访问,而可以被外部访问,而protected可以被派生类访问。可以被派生类访问。若类需修改,只需修改类的内部程序和保护或私有数据,若类需修改,只需修改类的内部程序和保护或私有数据,而类的对外接口不变,即公共成员函数的功能、名字、而类的对外接口不变,即公共成员函数的功能、名字、参数不变,则不需改外部应用程序。参数不变,则不需改外部应用程序。类成员保护的好处:类成员保护的好处:由此可以建立搭建应
20、用程序的基础块,这些块由此可以建立搭建应用程序的基础块,这些块是通用的和安全的是通用的和安全的例子见书例子见书p250-251面向对象程序设计面向对象程序设计问题问题:类中定义的类中定义的public数据成员与全局变量的区别数据成员与全局变量的区别?不同之处不同之处:若类的对象是全局的若类的对象是全局的,则访问都是整个程序则访问都是整个程序但类的但类的public数据成员要通过数据成员要通过对象对象访问访问类中成员类中成员:每定义一个对象则生成一个该成员的变量每定义一个对象则生成一个该成员的变量全局变量只有一个全局变量只有一个作用域作用域:类中成员类中成员:由对象变量的作用域决定由对象变量的作
21、用域决定 全局变量全局变量:整个程序整个程序面向对象程序设计面向对象程序设计什么是对象什么是对象:对象是类类型的变量。对象是类类型的变量。类成员类成员protected:public:private:定义对象时定义对象时,为每个为每个数据成员分配空间数据成员分配空间,为每个成员函数建立为每个成员函数建立入口地址入口地址(即函数指针、即函数指针、函数参数和函数返回值函数参数和函数返回值)this*1.3 对象对象通过对象访问类的成员通过对象访问类的成员人、车、动物等是一些抽象的概念,人、车、动物等是一些抽象的概念,每个抽象的概念有它的特征,每个抽象的概念有它的特征,这就好像是类。这就好像是类。对
22、象是抽象类的实例,即当变量存放一个值时,对象是抽象类的实例,即当变量存放一个值时,这个值就是一个特定的人或车或动物等,不再是抽象的概念了。这个值就是一个特定的人或车或动物等,不再是抽象的概念了。面向对象程序设计面向对象程序设计例例1-5/本文件名为 class1.h(关于多文件编译,见上机指导)class Humanpublic:void assignhuman(char*,char*,char*);/赋予对象属性void display();/显示某个人的信息int updatecorp(char*corperation);/修改某个人的工作单位protected:char name40;/
23、存放姓名的数组struct int year;int month;int date;birthday;/存放生日的结构型变量char corperation100;/存放工作单位的数组;面向对象程序设计面向对象程序设计/本文件名为 class1.cpp#include#include#include /atoi()#include class1.hvoid Human:assignhuman(char*np,char*bp,char*cp)char temp5;strcpy(name,np);strncpy(temp,bp,4);temp4=0;birthday.year=atoi(temp)
24、;strncpy(temp,bp+5,2);temp2=0;birthday.month=atoi(temp);strncpy(temp,bp+8,2);temp2=0;birthday.date=atoi(temp);strcpy(corperation,cp);void Human:display()cout A person info:endl;coutname birthday.year/birthday.month/birthday.date corperationendl;int Human:updatecorp(char*cp)strcpy(corperation,cp);ret
25、urn 0;面向对象程序设计面向对象程序设计/本文件名为 main.cpp#include#include#include#include class1.hvoid main()Human zhang;Human classmates10;int i;char name20,birthday11,corp50;zhang.assignhuman(zhang ming,1972/10/12,SCUT);zhang.display();(接下一页接下一页)name:birthday:corperation:zhangname:birthday:corperation:name:birthday:c
26、orperation:name:birthday:corperation:classmanes0classmanes1classmanes9iname0-19birthday0-10corp0-49对象存储空间分配示意图对象存储空间分配示意图:面向对象程序设计面向对象程序设计for(i=0;i2;i+)cout Please input a person info:name,birthday,corperation namebirthdaycorp;cout name birthday corpendl;if(!strchr(birthday,/)/检查输入的生日中是否包含/cout Inpu
27、t error.endl;elseclassmatesi.assignhuman(name,birthday,corp);for(i=0;i成员函数名成员函数名();不同类的成员函数可同名不同类的成员函数可同名,实际为不同的函数实际为不同的函数普通函数的调用与在普通函数的调用与在C语言中的调用相同语言中的调用相同 见例子见例子1-6中的中的readpeople()可替换为可替换为display()面向对象程序设计面向对象程序设计例1-6/用引用调用成员函数#include#include#include#include class1.hvoid readhuman(Human&);/是普通函数
28、的声明void main()Human zhang;Human classmates10;int i;zhang.assignhuman(zhang ming,1972/10/12,SCUT);zhang.display();cout zhang.nameendl;/!该语句是错误的,因数据成员name是被保护的 /!不能在普通函数中访问for(i=0;i2;i+)readpeople(classmatesi);/调用函数readpeople(classmatesi)for(i=0;i2;i+)classmatesi.display();classmates1.updatecorp(HP);c
29、lassmates1.display();面向对象程序设计面向对象程序设计void readpeople(Human&pp)/pp是引用类型,即对象的别名char name20,birthday11,corp50;cout Please input a person info:name,birthday,corperation namebirthdaycorp;cout name birthday corpendl;if(!strchr(birthday,/)cout Input error.endl;else pp.assignhuman(name,birthday,corp);/用引用调用
30、成员函数readpeople(Human&)可改名为display(Human&)面向对象程序设计面向对象程序设计例1-7/用对象指针调用成员函数#include#include#include#include class1.hvoid readpeople(Human *);/普通函数声明;参数为指向Human类的指针void main()Human zhang;Human classmates10;int i;zhang.assignhuman(zhang ming,1972/10/12,SCUT);zhang.display();for(i=0;i2;i+)readpeople(&cla
31、ssmatesi);for(i=0;i2;i+)classmatesi.display();classmates1.updatecorp(HP);classmates1.display();面向对象程序设计面向对象程序设计void readpeople(Human*pp)/pp是指向classmatesi对象的指针char name20,birthday11,corp50;cout Please input a person info:name,birthday,corperation namebirthdaycorp;cout name birthday corpendl;if(!strch
32、r(birthday,/)/birthday中是否包含/cout Input error.assignhuman(name,birthday,corp);/用指针调用成员函数面向对象程序设计面向对象程序设计类的作用域类的作用域:类成员的作用域位于类中,类成员的作用域位于类中,即类的任何成员可以访问该类的其他成员。即类的任何成员可以访问该类的其他成员。对象的作用域和存在性:对象的作用域和存在性:对象作用域和存在性同变量,即:对象作用域和存在性同变量,即:作用域作用域 存在性存在性 全局对象全局对象 整个程序可访问整个程序可访问 从程序开始到结束从程序开始到结束 全局静态对象全局静态对象 所在文件
33、可访问所在文件可访问 从程序开始到结束从程序开始到结束 局部对象局部对象 所在函数可访问所在函数可访问 从函数调用到结束从函数调用到结束 局部静态对象局部静态对象 所在函数可访问所在函数可访问 从程序开始到结束从程序开始到结束 面向对象程序设计面向对象程序设计问题问题1:问题问题2:如何测得如何测得Human类的对象所占的存储空间大小类的对象所占的存储空间大小默认函数参数值是否可以在定义中指定默认函数参数值是否可以在定义中指定void func(int x=0,int y=0)sizeof(Human)或或 sizeof(zhang),即各数据成员大小之和即各数据成员大小之和问题问题3:*定义在前调用在后则可以,定义在前调用在后则可以,*定义在后时则要放在原形说明中定义在后时则要放在原形说明中如何定义如何定义Human型对象的链表:型对象的链表:zhangwang.class Human char name20;struct birthday;Human*next;.;面向对象程序设计面向对象程序设计实例实例1.构造一个时钟类,成员数据:时、分、秒为私有构造一个时钟类,成员数据:时、分、秒为私有其成员函数有:其成员函数有:置时钟;置时钟;显示时钟;显示时钟;用时种类编程序。用时种类编程序。面向对象程序设计实例:面向对象程序设计实例:
限制150内