C语言面向对象程序设计1

上传人:liu****han 文档编号:242978861 上传时间:2024-09-13 格式:PPT 页数:41 大小:167.50KB
返回 下载 相关 举报
C语言面向对象程序设计1_第1页
第1页 / 共41页
C语言面向对象程序设计1_第2页
第2页 / 共41页
C语言面向对象程序设计1_第3页
第3页 / 共41页
点击查看更多>>
资源描述
面向对象程序设计,面向对象程序设计,C+,程序设计语言,主讲:陈泽琳,学时安排:,上课学时:24,上机学时:16,参考资料:,(美),H.M.,Deitel,等著,薛万鹏等译,“,C+,程序设计教程”,郑莉等编著, “,C+,语言程序设计”,钱能主编, “,C+,程序设计教程”,刘路放编著, “,Visual C+,与面向对象程序设计教程”,杜建成等编著, “,C+,简明教程”,.,课程学习的目标:,学习,C+,程序设计语言,,掌握面向对象程序设计方法。,课程学习的要求:,预习,通过例子了解概念,编程上机实践。,课程大纲:,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,类库及程序框架,9. 面向对象程序设计(,Object-oriented programming),C,程序复习,(函数、参数、指针、引用、执行过程与程序),讲课内容的一点说明:,书的内容写的很细, 讲课时先讲主要内容,通过例子理解, 在此过程中主要学习编程序,最后再补充,C+,的细节规则。,课件中的约定:,基础内容,重点内容*,难点内容*,需要注意的内容#,应多练习的内容#,1. 类(,class),1.1,类的概念,面向对象程序设计,问题: (例1-1),编写一个时钟的程序,程序可以设置时、分、秒,,可以判断设置的时间是否合理(时:0-23,分:0-59,,秒:0-59),显示时间。,什么是类?,类是一种用户定义的数据类型,C,语言程序(结构化程序设计方法):,#,include ,struct,Time ,int,hour;,int,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 ,standard_time.minute = (m = 0 ,standard_time.second = (s = 0 ,void show_time(),cout, standard_time.hour: standard_time.minute: standard_time.second,endl,;,C+,语言程序(面向对象程序设计),#,include ,class,Time ,private:,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 ,minute = (m = 0 ,second = (s = 0 ,void,Time:,show_time(),cout, hour:minute: second,endl,;,Time,standard_time;,main(),standard_time .,set_time(18,20,30);,standard_time .,show_time();,看上去只是写法不同,实际上在面向对象程序设计中,,class,set_time(), show_time(),是一个整体, 是可以独立于,main(),主函数,也可以看成是对象的描述(注意这里的对象与后面要讲的对象一词,意思不同, 以后会详细介绍), 即面向对象。,而结构化程序设计中, 只能将问题划分为一个个函数模块, 哪些,函数模块可以描述一个子问题或一个对象, 程序中无法表示。,因此以上两个程序是有本质区别的, 面向对象程序设计可以将描述,完整的子问题提供给他人, 同时还能保护自己的程序不被他人乱改,多个面向对象子程序还可以象搭积木一样组合成大的面向对象程序,程序设计可以象生产汽车标准零件一样形成大规模生产, 而这些在,结构化程序设计中都很难做到。,为什么用类,: 可以实现面向对象的程序设计,即代码可以重用并受到保护,类是实现面向对象程序设计的基本工具,下面我们一步步地介绍关于类的定义、用类进行,面向对象程序设计的方法,class,类名,数据成员(,data members);,.,成员函数(,member functions);,;,类的定义:,class,类名,public :,公有段成员 ;,protected :,保护段成员 ;,private :,私有段成员 ;,;,面向对象程序设计,说明:,1. 类名的第一个字母一般大写;,2. 无论是数据成员,还是成员函数,都可用三个访问控制,关键字说明:,public、protected、private;,3.,默认情况是,private;,4.,说明为,private,的数据成员,其他对象不可访问的;,5. 类是一种类型的定义,不分配存储空间;,再看一个例子:(例1-2),描述人的信息:姓名、出生日、籍贯等,其成员函数有:设置姓名、出生日、籍贯等;,显示姓名、出生日、籍贯等,如要增加人的其他信息,学历、党派等,可以在类中,增加这些数据成员;还可以增加处理,这些数据成员的成员函数,class Human ,public:,Human();,display();,private:,char name10;,struct,int,year;,int,month;,int,date;,birthday;,char history20;,;,有成员函数和无成员函数;,成员的隐蔽和成员的公开;,类与结构的区别:,如何定义类成员,:数据成员;成员函数的声明,声明(或说明),定义,说明:,1. 所有类定义中声明的成员函数都要定义其成员函数的实现;,2. 在类中定义成员函数, 默认为内联函数;(小函数,执行效率高);,3. 在类之外定义成员函数, 函数名必须为,类名:成员函数名(),4. 非成员函数的全称为,:函数名,(不会引起出错时可省略:),1.2 类成员的定义,:称为作用域运算符,例1-3,(在类的内部定义成员函数),#,include ,class Time ,public:,void set_time(,int,h,int,m,int,s),hour = (h = 0 ,minute = (m = 0 ,second = (s = 0 ,void show_time(),cout, hour:minute: second,endl,;,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 ,minute = (m = 0 ,second = (s = 0 ,void,Time:,show_time(),cout, hour: minute: second,endl,;,类成员的保护,: (即对象成员的访问限制),类成员为,public,则任何函数可以访问,提供给外部的接口;,为,protected,则自己类的成员函数,和派生类的成员函数可以访问;,为,private,则只能被自己类的成员函数访问。,注: 访问包括赋值和引用,a.birthday.year = 1998;,cout, a.name,成员访问说明符:,public:、protected:、private:,除了全局变量赋初值,C,及,C+,的变量访问,都是在函数中完成的,类的数据成员的访问也是在成员函数或,一般函数中完成的,(一般函数只能访问,public,数据),函数中访问数据(类的数据成员),函数调用函数,例1-4,class Test,public:,void,putpuba,(,int,);,int puba,;,protected:,void,putproa,(,int,);,int proa,;,private:,void,putpria,(,int,);,int pria,;,;,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,(),endl,;,cout,puba,is ,puba,; ;,cout,proa,is ,proa,; ;,cout,pria,is ,pria,; ,endl,;,/,访问自己的私有成员,putpria,(a+3);,cout,end 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,(),与下一函数调用,/只能执行一个,否则循环调用,/,putproa,(a+1);,cout,end 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 member,obj,.,putpuba,(a);,/,obj,.,putproa,(b); error:,putproa,() is protected member,/,obj,.,putpria,(c); error:,putpria,() is private member,cout, end,endl,;,类定义的,public,段是类的对外接口, 可以被外部访问,,而,protected,可以被派生类访问。,若类需修改,只需修改类的内部程序和保护或私有数据,,而类的对外接口不变,即公共成员函数的功能、名字、,参数不变,则不需改外部应用程序。,类成员保护的好处:,由此可以建立搭建应用程序的基础块,这些块,是通用的和安全的,例子见书,p250-251,问题:,类中定义的,public,数据成员与全局变量的区别?,不同之处:,若类的对象是全局的,则访问都是整个程序,但类的,public,数据成员要通过,对象,访问,类中成员: 每定义一个对象则生成一个该成员的变量,全局变量只有一个,作用域: 类中成员:由对象变量的作用域决定,全局变量:整个程序,什么是对象:,对象是类类型的变量。,类成员,protected:,public:,private:,定义对象时,为每个,数据成员分配空间,为每个成员函数建立,入口地址(即函数指针、,函数参数和函数返回值),this,*,1.3 对象,通过对象访问类的成员,人、车、动物等是一些抽象的概念,,每个抽象的概念有它的特征,,这就好像是类。,对象是抽象类的实例,即当变量存放一个值时,,这个值就是一个特定的人或车或动物等,不再是抽象的概念了。,例1-5,/,本文件名为,class1.h(,关于多文件编译,见上机指导),class Human,public:,void,assignhuman,(char *, char *, char *); /,赋予对象属性,void display(); /,显示某个人的信息,int updatecorp,(char *,corperation,); /,修改某个人的工作单位,protected:,char name40;,/,存放姓名的数组,struct,int,year;,int,month;,int,date;,birthday;,/,存放生日的结构型变量,char,corperation,100; /,存放工作单位的数组,;,/,本文件名为,class1.,cpp,#include ,#include ,#include /,atoi,(),#include class1.h,void Human:,assignhuman,(char *,np, char *,bp, char *cp),char temp5;,strcpy,(name,np,);,strncpy,(temp,bp,4); temp4=0;,birthday.year =,atoi,(temp);,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,;,cout,name birthday.year/birthday.month,/birthday.date ,corperation,endl,;,int,Human:,updatecorp,(char *,cp,),strcpy,(,corperation,cp,);,return 0;,/本文件名为,main.,cpp,#include ,#include ,#include ,#include class1.h,void main(),Human,zhang,;,Human,classmates10;,int,i;,char name20, birthday11,corp,50;,zhang,.,assignhuman,(,zhang ming, 1972/10/12,SCUT);,zhang,.,display();,(接下一页),name:,birthday:,corperation,:,zhang,name:,birthday:,corperation,:,name:,birthday:,corperation,:,name:,birthday:,corperation,:,classmanes,0,classmanes,1,classmanes,9,i,name0-19,birthday0-10,corp,0-49,对象存储空间分配示意图:,for (i=0;i2;i+) ,cout, Please input a person info: name, birthday,corperation, namebirthday,corp,;,cout, name birthday ,corp,endl,;,if (!,strchr,(birthday,/)/,检查输入的生日中是否包含/,cout, Input error. ,endl,;,else,classmatesi.,assignhuman,(name,birthday,corp,);,for (i=0;i成员函数名();,不同类的成员函数可同名, 实际为不同的函数,普通函数的调用与在,C,语言中的调用相同,见例子,1-6,中的,readpeople,(),可替换为,display(),例1-6,/用,引用,调用成员函数,#,include ,#include ,#include ,#include class1.h,void,readhuman,(Human, /,是普通函数的声明,void main(),Human,zhang,;,Human classmates10;,int,i;,zhang,.,assignhuman,(,zhang ming, 1972/10/12,SCUT);,zhang,.display();,cout,zhang,.name,endl,; /,!,该语句是错误的, 因数据成员,name,是被保护的,/,!,不能在普通函数中访问,for (i=0;i2;i+),readpeople,(classmatesi); /,调用函数,readpeople,(classmatesi),for (i=0;i2;i+),classmatesi.display();,classmates1.,updatecorp,(HP);,classmates1.display();,void,readpeople,(Human & pp) /pp,是引用类型, 即对象的别名,char name20, birthday11,corp,50;,cout, Please input a person info: name, birthday,corperation, namebirthday,corp,;,cout, name birthday ,corp,endl,;,if (!,strchr,(birthday,/),cout, Input error. ,endl,;,else,pp.,assignhuman,(name,birthday,corp,);/,用引用调用成员函数,readpeople,(Human &),可改名为,display(Human &),例1-7,/用,对象指针,调用成员函数,#,include ,#include ,#include ,#include class1.h,void,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,(,for (i=0;i2;i+),classmatesi.display();,classmates1.,updatecorp,(HP);,classmates1.display();,void,readpeople,(Human * pp)/pp,是指向,classmatesi,对象的指针,char name20, birthday11,corp,50;,cout, Please input a person info: name, birthday,corperation, namebirthday,corp,;,cout, name birthday ,corp,endl,;,if (!,strchr,(birthday,/)/birthday,中是否包含/,cout, Input error. ,assignhuman,(name,birthday,corp,); /,用指针调用成员函数,类的作用域,:,类成员的作用域位于类中,,即类的任何成员可以访问该类的其他成员。,对象的作用域和存在性:,对象作用域和存在性同变量,即:,作用域 存在性,全局对象 整个程序可访问 从程序开始到结束,全局静态对象 所在文件可访问 从程序开始到结束,局部对象 所在函数可访问 从函数调用到结束,局部静态对象 所在函数可访问 从程序开始到结束,问题1:,问题2:,如何测得,Human,类的对象所占的存储空间大小,默认函数参数值是否可以在定义中指定,void,func,(,int,x=0,int,y=0),sizeof,(Human),或,sizeof,(,zhang,),即各数据成员大小之和,问题3:,*定义在前调用在后则可以,,*定义在后时则要放在原形说明中,如何定义,Human,型对象的链表:,zhang,wang,.,class Human ,char name20;,struct,birthday;,Human *next;,.,;,实例1.,构造一个时钟类,成员数据:时、分、秒为私有,其成员函数有:,置时钟;,显示时钟;,用时种类编程序。,面向对象程序设计实例:,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!