第3讲类与对象精选PPT.ppt

上传人:石*** 文档编号:78723734 上传时间:2023-03-19 格式:PPT 页数:70 大小:3.13MB
返回 下载 相关 举报
第3讲类与对象精选PPT.ppt_第1页
第1页 / 共70页
第3讲类与对象精选PPT.ppt_第2页
第2页 / 共70页
点击查看更多>>
资源描述

《第3讲类与对象精选PPT.ppt》由会员分享,可在线阅读,更多相关《第3讲类与对象精选PPT.ppt(70页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第3讲类与对象第1页,本讲稿共70页2本讲主要内容本讲主要内容this指针指针静态数据成员与静态成员函数静态数据成员与静态成员函数友元友元类对象作为成员类对象作为成员第2页,本讲稿共70页3this指针指针第3页,本讲稿共70页4引入引入this指针指针请看前面例题代码。请看前面例题代码。int main()CStudent Student1(张明张明,50201000901,0,软件工软件工程程);Student1.DisplayInfo();CStudent Student2(“李彤李彤”,“50201000911”,1,“计计算机科学与技术算机科学与技术);Student2.Displa

2、yInfo();return 0;当执行Student1.DisplayInfo();时,为什么系统能够将对象Student1的各个成员输出?当执行Student2.DisplayInfo();时,为什么系统能够将对象Student2的各个成员输出?第4页,本讲稿共70页5CStudent:DisplayInfo()void CStudent:DisplayInfo()/显示学生基本信息显示学生基本信息cout m_strName 的信息为:的信息为:endl;cout姓名:姓名:m_strName 编号:编号:m_strID 性别:性别:;if(m_cSex=0)cout男男 ;elseco

3、ut女女 ;cout专业:专业:m_strMajorendl;成员函数DisplayInfo()的代码中有没有对象的信息呢?好像没有。第5页,本讲稿共70页6对象对象Student1和和Student2的内存布的内存布局局m_strName “李彤李彤”m_strID 1002m_cSex 1m_strMajor“计算机计算机”GetName()代码地址SetName()代码地址GetName()代码SetName代码Student1Student2代码代码m_strName “张明张明”m_strID 2003m_cSex 0m_strMajor“软件工程软件工程”GetName()代码地址

4、SetName()代码地址DisplayInfo()代码地址DisplayInfo()代码DisplayInfo()代码地址第6页,本讲稿共70页7一个问题一个问题一个类中所有的对象调用的成员函数都是同一一个类中所有的对象调用的成员函数都是同一代码段。代码段。那么,成员函数又是怎么识别出当前调用自己那么,成员函数又是怎么识别出当前调用自己的是哪个对象,从而对该对象的数据成员而的是哪个对象,从而对该对象的数据成员而不是其他对象的数据成员进行处理呢?不是其他对象的数据成员进行处理呢?第7页,本讲稿共70页8This指针指针 C+中有一个特殊的指针中有一个特殊的指针this,称为自引用指针。这个指针

5、,称为自引用指针。这个指针与类密切相关。与类密切相关。每当创建一个对象时,系统就把每当创建一个对象时,系统就把this指针初始化为指向指针初始化为指向该对象。该对象。C+为类的每个成员函数都提供了这个隐含的为类的每个成员函数都提供了这个隐含的名字为名字为this的指针参数:的指针参数:类名类名*const this因此可以说,因此可以说,指针指针this指向一个对象指向一个对象,该对象产生成员函,该对象产生成员函数的调用动作。数的调用动作。第8页,本讲稿共70页9This指针指针 在成员函数中,隐含了对在成员函数中,隐含了对this指针的使用。例如,成员函指针的使用。例如,成员函数数Displ

6、ayInfo()的定义被编译系统处理为:的定义被编译系统处理为:void CStudent:DisplayInfo(CStudent*const this)cout m_strName 的信息为:的信息为:endl;cout姓名:姓名:m_strName 编号:编号:m_strID m_cSex=0)cout男男 ;elsecout女女 ;cout专业:专业:m_strMajorendl;第9页,本讲稿共70页10而调用成员函数的语句则被编译系统处理成:而调用成员函数的语句则被编译系统处理成:int main()CStudent Student1(张明张明,50201000901,0,软软件工

7、程件工程);Student1.DisplayInfo(&Student1);CStudent Student2(“李彤李彤”,“50201000911”,1,“计算机科学与技术计算机科学与技术);Student2.DisplayInfo(&Student2);return 0;第10页,本讲稿共70页11【例2-15】输出输出this指针的值。改写指针的值。改写CStudent:DisplayInfo()。void CStudent:DisplayInfo()cout m_strName 的信息为:的信息为:endl;cout姓名:姓名:m_strName 编号:编号:m_strID 性别:性

8、别:;if(m_cSex=0)cout男男 ;elsecout女女 ;cout专业:专业:m_strMajorendl;coutthis指针的值为:指针的值为:thisendl;第11页,本讲稿共70页12修改修改main(),将对象的地址输出和,将对象的地址输出和this指针的值进行对比指针的值进行对比#include using namespace std;#include Student.hint main()CStudent Student1(张明张明,50201000901,0,软件工程软件工程);Student1.DisplayInfo();coutStudent1对象的地址为:对

9、象的地址为:&Student1endl;CStudent Student2(李彤李彤,50201000911,1,计算机科学与技术计算机科学与技术);Student2.DisplayInfo();coutStudent2对象的地址为:对象的地址为:&Student2endl;return 0;第12页,本讲稿共70页13程序运行结果程序运行结果第13页,本讲稿共70页14使用使用this指针指针【例2-16】为案例程序添加一个拷贝函数,功能是将一个对象拷贝给另外一个对象。#include using namespace std;class CStudent/学生类学生类public:void

10、Copy(CStudent&Student);进行两个学生对象之间的拷贝第14页,本讲稿共70页15void CStudent:Copy(CStudent&Student)/判断复制目的对象与源对象是否是同一个对象判断复制目的对象与源对象是否是同一个对象if(this=&Student)return;delete m_strName;m_strName=new charstrlen(Student.m_strName)+1;strcpy(m_strName,Student.m_strName);delete m_strID;m_strID=new charstrlen(Student.m_st

11、rID)+1;strcpy(m_strID,Student.m_strID);m_cSex=Student.m_cSex;delete m_strMajor;m_strMajor=new charstrlen(Student.m_strMajor)+1;strcpy(m_strMajor,Student.m_strMajor);第15页,本讲稿共70页16int main()CStudent Student1(王晓天王晓天,50201000701,0,电子信息工程电子信息工程);CStudent Student2(张慧张慧,50201000902,1,软件工程软件工程);Student1.Di

12、splayInfo();Student2.DisplayInfo();Student1.Copy(Student2);Student1.DisplayInfo();Student2.DisplayInfo();return 0;编译连接运行程序。编译连接运行程序。第16页,本讲稿共70页17this指针的其他用途指针的其他用途当在类的非静态成员函数中返回类对象本身时,可以当在类的非静态成员函数中返回类对象本身时,可以直接使用直接使用return*this;。当成员函数的形参名与数据成员的变量名相同时,当成员函数的形参名与数据成员的变量名相同时,如果需要进行二者之间的赋值操作,可以通过如果需要进

13、行二者之间的赋值操作,可以通过this指针进行区分。指针进行区分。例如:例如:this-n =n;而不能写成而不能写成:n=n;this-n是对象的数据成员,而n是成员函数的形参。第17页,本讲稿共70页18静态数据成员与静态成员函数静态数据成员与静态成员函数第18页,本讲稿共70页19学生人数的问题学生人数的问题 在在“大学人员信息管理系统大学人员信息管理系统”中,我们需要做一些统中,我们需要做一些统计数据和分析数据的工作,例如:计数据和分析数据的工作,例如:统计学生的统计学生的人数人数;计算学生计算学生平均年龄平均年龄;计算学生的计算学生的平均成绩平均成绩;计算学生的计算学生的总成绩总成绩

14、;这些数据的共同特点是:它们属于全体学生。那么这样的数据存放在哪里呢?不能存放在类中,因为类不是一个占有内存的实体。那么归哪个对象所有?一旦学生人数、总成绩等发生变化。要每个对象逐个修改?思考:如何解决?第19页,本讲稿共70页20静态成员静态成员 当一个类的多个对象需要共享数据时,可以利用当一个类的多个对象需要共享数据时,可以利用静态数据静态数据成员成员和和静态成员函数静态成员函数来实现。来实现。例如,例如,学生人数学生人数是和是和每一个学生对象每一个学生对象有关的(每次新建有关的(每次新建一个学生对象,学生人数都应该增一个学生对象,学生人数都应该增1),但它又不能),但它又不能只属于某一个

15、学生对象,这时就可以将学生人数说明只属于某一个学生对象,这时就可以将学生人数说明成类的静态数据成员,以实现学生对象之间的数据共成类的静态数据成员,以实现学生对象之间的数据共享。享。第20页,本讲稿共70页21【例2-17】利用静态数据成员统计学生的人数。利用静态数据成员统计学生的人数。class CStudent/学生类学生类static unsigned long m_nCount;/学生人数,静态数据成员学生人数,静态数据成员private:public:unsigned long GetCount();CStudent:CStudent(char*strName,char*strID,c

16、har cSex,char*strMajor)m_strName=new charstrlen(strName)+1;strcpy(m_strName,strName);m_nCount+;静态数据成员的声明在构造函数中增加学生的人数关键字描述类的所有对象共同特性的数据项第21页,本讲稿共70页22CStudent:CStudent(const CStudent&student)m_strName=new charstrlen(student.m_strName)+1;strcpy(m_strName,student.m_strName);m_strID=new charstrlen(stud

17、ent.m_strID)+1;strcpy(m_strID,student.m_strID);m_cSex=student.m_cSex;m_strMajor=new charstrlen(student.m_strMajor)+1;strcpy(m_strMajor,student.m_strMajor);m_nCount+;CStudent:CStudent()delete m_strName;delete m_strID;delete m_strMajor;m_nCount-;在析构函数中进行学生人数的减一在拷贝构造函数中进行学生人数的增一第22页,本讲稿共70页23unsigned l

18、ong CStudent:GetCount()return m_nCount;unsigned long CStudent:m_nCount=0;int main()CStudent Student1(王晓天王晓天,50201000701,0,电子信息工电子信息工程程);cout学生人数为:学生人数为:Student1.GetCount()endl;CStudent Student2(张慧张慧,50201000902,1,软件工程软件工程);cout学生人数为:学生人数为:Student2.GetCount()endl;CStudent Student3(Student1);cout学生人数为

19、:学生人数为:Student3.GetCount()endl;return 0;获取静态数据成员的值静态数据成员的定义与初始化静态数据成员不能在任何函数内分配空间和初始化。必须将其放在类的内部实现部分中定义。定义时,要使用类名引导。第23页,本讲稿共70页24说明说明(1)对静态数据成员的定义与初始化应在类外进行,)对静态数据成员的定义与初始化应在类外进行,通常在类声明之后,主函数通常在类声明之后,主函数main之前进行。之前进行。在定义和初始化静态成员时,不必在前面添加关键在定义和初始化静态成员时,不必在前面添加关键字字static。(2)静态数据成员同静态变量一样,在编译时就被创建)静态数

20、据成员同静态变量一样,在编译时就被创建和初始化。和初始化。第24页,本讲稿共70页25静态成员函数静态成员函数 静态成员函数的主要作用是访问静态数据成静态成员函数的主要作用是访问静态数据成员。员。通过静态成员函数,可以通过静态成员函数,可以在对象建立之前在对象建立之前进进行静态数据成员的访问。行静态数据成员的访问。第25页,本讲稿共70页26【例2-18】通过静态成员函数访问静态数据成员。通过静态成员函数访问静态数据成员。class CStudent/学生类学生类static unsigned long m_nCount;/学生人数学生人数private:char*m_strName;/姓名姓

21、名public:static unsigned long GetCount();/静态成员函数静态成员函数;声明时前面要写明static第26页,本讲稿共70页27CStudent:CStudent(char*strName,char*strID,char cSex,char*strMajor)m_nCount+;CStudent:CStudent(const CStudent&student)m_nCount+;CStudent:CStudent()m_nCount-;unsigned long CStudent:GetCount()return m_nCount;定义时前面不需要加stat

22、ic第27页,本讲稿共70页28unsigned long CStudent:m_nCount=0;int main()cout学生人数为:CStudent:GetCount()endl;CStudent Student1(王晓天王晓天,50201000701,0,电子信息工电子信息工程程);cout学生人数为:学生人数为:Student1.GetCount()endl;CStudent Student2(张慧张慧,50201000902,1,软件工程软件工程);cout学生人数为:学生人数为:Student2.GetCount()endl;CStudent Student3(Student1

23、);cout学生人数为:学生人数为:Student3.GetCount()-静态成员函数名静态成员函数名(实参表实参表)由于类的静态成员函数是类的一部分,而不是某个对象的一部分,建由于类的静态成员函数是类的一部分,而不是某个对象的一部分,建议在进行静态成员函数调用时,使用第议在进行静态成员函数调用时,使用第种形式,以方便对程序种形式,以方便对程序的阅读与理解。的阅读与理解。第31页,本讲稿共70页32(3)静态成员函数与非静态成员函数的主要区别在于:非静态成员函)静态成员函数与非静态成员函数的主要区别在于:非静态成员函数有数有this指针,而静态成员函数指针,而静态成员函数没有没有this指针

24、指针。由于静态成员函数属于类,没有由于静态成员函数属于类,没有this指针,因此静态成员函数不能指针,因此静态成员函数不能直接访问非静态成员,而应通过对象、对象指针或对象引用间接地进直接访问非静态成员,而应通过对象、对象指针或对象引用间接地进行访问。例如:行访问。例如:unsigned long CStudent:GetCount()SetSex(0);coutm_strNameendl;return m_nCount;说明说明 错误:不能在静态成员函数中直接调用非静态成员函数错误:不能在静态成员函数中访问非静态数据成员第32页,本讲稿共70页33静态成员静态成员 静态成员是静态成员是C+里用

25、来解决同一个类的不同对里用来解决同一个类的不同对象间的数据共享问题,静态成员包括:象间的数据共享问题,静态成员包括:静态数据成员静态数据成员静态成员函数静态成员函数 C+用静态数据成员来实现同一个类的不同对象间的数据共享,即不需要在每个对象中为这些公用数据单独开辟存储单元了。C+用静态数据成员来实现同一个类的不同对象间的数据共享,即不需要在每个对象中为这些公用数据单独开辟存储单元了。第33页,本讲稿共70页34图图 类的静态成员类的静态成员m_nCount类的公共成员类的公共成员(静态成员静态成员)无论对象有多少,甚至没有,静态成员m_nCount也只有一个。所有的CStudent类对象都共享

26、它,并且能够访问它。m_strName “张三张三”m_strID 1002m_cSex 1m_strMajor“计算机计算机”GetName()代码地址SetName()代码地址GetName()代码SetName代码student1student2代码代码m_strName “李四李四”m_strID 2003m_cSex 0m_strMajor“软件工程软件工程”GetName()代码地址SetName()代码地址第34页,本讲稿共70页35静态数据成员用得较多的场合静态数据成员用得较多的场合 用来保存流动变化的对象个数(如:用来保存流动变化的对象个数(如:m_nCount););作作为

27、为一一个个标标志志,指指示示一一个个特特定定动动作作是是否否发发生生(如如:可可能能创创建建几几个个对对象象,每每个个对对象象要要对对某某个个磁磁盘盘文文件件进进行行写写操操作作,但但显显然然在在同同一一时时间间里里只只允允许许一一个个对对象象写写文文件件,在在这这种种情情况况下下,用用户户希希望望说说明明一一个个静静态态数数据据成成员员指指出出文文件件何何时时正正在使用,何时处于空闲状态);在使用,何时处于空闲状态);一个指向一个链表第一成员或最后一个成员的指针一个指向一个链表第一成员或最后一个成员的指针(如(如pFirst)。)。第35页,本讲稿共70页36总结总结 静态数据成员的定义:在

28、定义或说明时加关键字静态数据成员的定义:在定义或说明时加关键字“static”。如:。如:static int x;静态数据成员的初始化静态数据成员的初始化 不能用构造函数初始化。不能用构造函数初始化。初始化只能在类体外进行,前面不能加关键字初始化只能在类体外进行,前面不能加关键字“static”。静态数据成员属于类,不属于对象。静态数据成员的存储空静态数据成员属于类,不属于对象。静态数据成员的存储空间不在任何一个对象的存储空间内,它是所有对象共有的。间不在任何一个对象的存储空间内,它是所有对象共有的。第36页,本讲稿共70页37静态数据成员的访问限制静态数据成员的访问限制公共静态数据成员公共

29、静态数据成员可被类的外部访问;可被类的外部访问;保护或私有静态数据成员保护或私有静态数据成员只可被类的内部访只可被类的内部访问。问。第37页,本讲稿共70页38友元友元第38页,本讲稿共70页39数据共享数据共享 数据的共享包括:数据的共享包括:同一个类的不同对象间的数据共享(静态同一个类的不同对象间的数据共享(静态成员);成员);不同类的数据共享(友元)。不同类的数据共享(友元)。第39页,本讲稿共70页40友元友元类的主要目的之一是实现信息的隐藏与封装,即类的私有类的主要目的之一是实现信息的隐藏与封装,即类的私有成员在类的外部不可见,不能直接进行访问,只能通过对成员在类的外部不可见,不能直

30、接进行访问,只能通过对外的接口函数间接地进行访问。但这样往往外的接口函数间接地进行访问。但这样往往会降低对私有会降低对私有数据成员的访问效率数据成员的访问效率。有时候,某些特殊的函数或类需要对这些私有成员进有时候,某些特殊的函数或类需要对这些私有成员进行直接访问,这时,就需要打破类的封装。行直接访问,这时,就需要打破类的封装。这种能够这种能够对类的私有成员直接进行访问的外部类或外部函数被对类的私有成员直接进行访问的外部类或外部函数被称为(类的)友元称为(类的)友元。类中的私有成员只能通过类本身的成员函数来访问,类中的私有成员只能通过类本身的成员函数来访问,如果需要在类的外部访问类的私有成员,只

31、有通过友如果需要在类的外部访问类的私有成员,只有通过友元来解决。元来解决。第40页,本讲稿共70页41友元的三种形式友元的三种形式友元函数友元函数一个类的友元函数,是一个类的友元函数,是在该类中说明的一个普通的函数在该类中说明的一个普通的函数,它不是,它不是该类的成员,但允许访问该类的所有对象的私有成员。该类的成员,但允许访问该类的所有对象的私有成员。友元成员友元成员将将类的成员函数说明为另一个类的友元类的成员函数说明为另一个类的友元,这样可以使得两个类,这样可以使得两个类以某种方式相互合作,协调工作,完成某一任务。以某种方式相互合作,协调工作,完成某一任务。友元类友元类将一个类说明为另一个类

32、的友元将一个类说明为另一个类的友元,即这个类的所有成员函数都,即这个类的所有成员函数都是另一个类的友元函数。可以访问另一个类中的保护或私有数是另一个类的友元函数。可以访问另一个类中的保护或私有数据成员。据成员。第41页,本讲稿共70页42友元函数友元函数【例2-19】写一个函数,比较两个学生的姓名是否相同。写一个函数,比较两个学生的姓名是否相同。【分析分析】学生的姓名是私有数据,外部函数是不能访问的,如果要访问必须通过接口函数,如GetName()。除此之外,还有一个办法,就是将这个类外部的函数声明为学生类的“朋友”,即友元函数,就可以访问类的私有数据了。第42页,本讲稿共70页43class

33、 CStudent/学生类学生类private:char*m_strName;/姓名姓名public:/friend bool CompareName(CStudent&Student1,CStudent&Student2);bool CompareName(CStudent&Student1,CStudent&Student2)if(strcmp(Student1.m_strName,Student2.m_strName)=0)return true;elsereturn false;友元函数友元函数可以直接访问类对象的私有成员友元函数必须在参数表中指出要访问的对象普通函数需要直接访问类的保

34、护数据成员或私有数据成员的原因主要是:为了提高效率。为了方便重载运算符的使用。友元函数的定义则在类的外部,一般与类的成员函数定义放在一起。因为类重用时,一般友元是一起提供的。第43页,本讲稿共70页44int main()CStudent Student1(王晓天王晓天,50201000701,0,电子信息电子信息工程工程);CStudent Student2(张慧张慧,50201000902,1,软件工程软件工程);if(CompareName(Student1,Student2)=true)coutStudent1和和Student2的姓名相同的姓名相同endl;elsecoutStude

35、nt1和和Student2的姓名不相同的姓名不相同endl;return 0;第44页,本讲稿共70页45友元函数与一般函数的差别友元函数与一般函数的差别 在定义上:在定义上:友元函数在定义或说明时,前面有关键字友元函数在定义或说明时,前面有关键字“friend”。当友元函数和成员函数的定义在类体外时,成员当友元函数和成员函数的定义在类体外时,成员函数前面要加函数前面要加“类名类名:”,友元函数前面不要加友元函数前面不要加“类名类名:”在使用方式上:友元函数必须在参数表中指出要访问在使用方式上:友元函数必须在参数表中指出要访问的对象,而成员函数则要用点运算符实现。的对象,而成员函数则要用点运算

36、符实现。第45页,本讲稿共70页46友元成员友元成员【例2-21】举例实现一个类的成员函数作为另举例实现一个类的成员函数作为另一个类的友元。一个类的友元。【分析】涉及到“友元成员”,那么一定会出现两个类。其中一个类的成员函数需要访问另一个类的私有数据,这时,可以将访问函数声明为被访问类的友元,即该函数为被访问类的友元成员。第46页,本讲稿共70页47#include using namespace std;class CBpublic:void CBModifyCA(CA&ca);class CAdouble x,y;public:CA(double d1=0.0,double d2=0.0)

37、x=d1;y=d2;void print()coutx=x y=yendl;friend void CB:CBModifyCA(CA&ca);类CB的成员函数CBModifyCA是类CA的友元函数class CA;提前引用说明,因为类CB中用到了类CA解决这种交叉声明问题的方法是先进行类名声明。让编译器知道CA类的名字已经登记在册,后面可以引用这个名字。类名声明不能用于定义该类的对象,因为这时还没有类的完整声明,没有分配类对象空间的依据。第47页,本讲稿共70页48void CB:CBModifyCA(CA&ca)ca.x+=2.0;ca.y+=3.0;int main()CA ca1(2.2

38、,3.3);ca1.print();CB cb1;cb1.CBModifyCA(ca1);ca1.print();return 0;类CA的友元函数可以直接访问CA对象的私有成员程序的运行结果:X=2.2 y=3.3X=4.2 y=6.3 第48页,本讲稿共70页49【例2-22】举例实现一个类作为另一个类的友举例实现一个类作为另一个类的友元。元。【分析】所谓“友元类”,即这个类的所有成员函数都是另一个类的友元函数。可以访问另一个类中的保护或私有数据成员。友元类友元类 第49页,本讲稿共70页50#include using namespace std;class CA;/提前引用说明,因为类

39、提前引用说明,因为类CB中用到了类中用到了类CAclass CB public:void CBModifyCA(CA&ca);void print(CA&ca);class CAdouble x,y;public:CA(double d1=0.0,double d2=0.0)x=d1;y=d2;void print()coutx=x y=yendl;friend CB;类CB是类CA的友元第50页,本讲稿共70页51void CB:CBModifyCA(CA&ca)ca.x+=2.0;ca.y+=3.0;void CB:print(CA&ca)coutx=ca.x y=ca.yendl;int

40、 main()CA ca1(2.2,3.3);ca1.print();CB cb1;cb1.CBModifyCA(ca1);cb1.print(ca1);return 0;作为类CA的友元类,CB的所有的成员函数可以直接访问CA对象的私有成员第51页,本讲稿共70页52数据共享小结数据共享小结使用静态数据成员,使用静态数据成员,实际上可以消灭全局变量实际上可以消灭全局变量。全局。全局变量给面向对象程序带来的问题就是违背封装原则。变量给面向对象程序带来的问题就是违背封装原则。要使用静态数据成员必须在要使用静态数据成员必须在main()程序运行前分配空程序运行前分配空间和初始化。使用静态成员函数,

41、可以在实际创建间和初始化。使用静态成员函数,可以在实际创建任何对象之前初始化专有的静态数据成员。静态成任何对象之前初始化专有的静态数据成员。静态成员不与类的任何特定对象相关联。员不与类的任何特定对象相关联。第52页,本讲稿共70页53友元的作用主要是为了提高效率和方便编辑。但是随着硬友元的作用主要是为了提高效率和方便编辑。但是随着硬件性能的提高,友元的这点作用是微不足道的。件性能的提高,友元的这点作用是微不足道的。相反,友元破坏了类的整体操作性,也破坏了类的封相反,友元破坏了类的整体操作性,也破坏了类的封装,所以在使用它时,要权衡利弊。装,所以在使用它时,要权衡利弊。第53页,本讲稿共70页5

42、4图图 友元的利弊友元的利弊私有数据GetNameGetIDm_strNamem_strID公共接口函数函数友元友元友元提供了数据访问的灵活性,但打破了类的封装机制,福兮?祸兮?第54页,本讲稿共70页55课程案例设计与编码课程案例设计与编码(课堂练习(课堂练习2)第55页,本讲稿共70页56课堂练习:友元的使用课堂练习:友元的使用为为CStudent类增加一个数据成员成绩:类增加一个数据成员成绩:m_fScore /成绩成绩修改相应的成员函数,如构造函数等。修改相应的成员函数,如构造函数等。增加另外一个类增加另外一个类教师类教师类CTeacher。数。数据成员如下:据成员如下:char m_

43、strName20;/姓名姓名 char m_strID12;/编号编号 char m_cSex;/性别:性别:0代表男代表男 1代表女代表女 float m_fSalary;/工资工资第56页,本讲稿共70页57教师修改学生的成绩教师修改学生的成绩为教师类为教师类CTeacher设计一个设计一个CStudent类的友类的友元成员元成员ModifyScore(),可以修改,可以修改CStudent 类对象的类对象的m_fScore成员。成员。第57页,本讲稿共70页58类对象作为成员类对象作为成员第58页,本讲稿共70页59类对象作为成员类对象作为成员 类中的数据成员可以是基本数据类型,也可以

44、是类中的数据成员可以是基本数据类型,也可以是类类型类类型这这样自定义的数据类型。样自定义的数据类型。在一个类的数据成员中包含了另一个类的对象称为类的组合。在一个类的数据成员中包含了另一个类的对象称为类的组合。这个被包含的对象称为这个被包含的对象称为对象成员对象成员或或子对象子对象。例如,类例如,类CStudent的对象还需要有一个数据成员的对象还需要有一个数据成员学生学生的出生日期,为此,我们设计一个的出生日期,为此,我们设计一个Date类,定义类,定义Date的对象的对象m_Birthday作为作为CStudent类的成员,称类的成员,称为为对象成员对象成员。第59页,本讲稿共70页60【例

45、2-23】日期类对象作为学生类的数据成员。日期类对象作为学生类的数据成员。【分析分析】Date类的对象作为类的对象作为CStudent类的成员,要做三类的成员,要做三件事情:件事情:首先设计一个首先设计一个Date类;类;将将Date的对象的对象m_Birthday加入到加入到CStudent类中类中成为其数据成员;成为其数据成员;修改修改CStudent类的构造函数、信息输出函数,类的构造函数、信息输出函数,并添加合适的其他相关成员函数。并添加合适的其他相关成员函数。Date类可以独立添加到项目中(也可以供其他的类可以独立添加到项目中(也可以供其他的类使用),也可以添加到类使用),也可以添加

46、到 CStudent类相应的文类相应的文件中。件中。第60页,本讲稿共70页61在在Student.h文件中添加如下代码:文件中添加如下代码:class CDate int m_nYear;int m_nMonth;int m_nDay;public:CDate(int nYear=0,int nMonth=0,int nDay=0);void SetDate(int nYear,int nMonth,int nDay);int GetYear();int GetMonth();int GetDay();日期类的声明第61页,本讲稿共70页62在在Student.cpp文件中添加如下代码:文件

47、中添加如下代码:CDate:CDate(int nYear,int nMonth,int nDay)m_nYear=nYear;m_nMonth=nMonth;m_nDay=nDay;void CDate:SetDate(int nYear,int nMonth,int nDay)m_nYear=nYear;m_nMonth=nMonth;m_nDay=nDay;int CDate:GetYear()return m_nYear;int CDate:GetMonth()return m_nMonth;int CDate:GetDay()return m_nDay;第62页,本讲稿共70页63c

48、lass CStudent/学生类学生类static unsigned long m_nCount;/学生人数学生人数private:char*m_strName;/姓名姓名char*m_strID;/编号编号char m_cSex;/性别:性别:0:男男 1:女女CDate m_Birthday;/出生日期出生日期(对象成员对象成员)char*m_strMajor;/专业专业public:CStudent(char*strName=,char*strID=,char cSex=0,char*strMajor=,int nYear=0,int nMonth=0,int nDay=0);CStu

49、dent();void SetName(char*strName);public:void SetBirthday(CDate Birthday);CDate GetBirthday();添加对象成员添加操作对象成员的成员函数修改构造函数的头部CDate对象成员m_Birthday是在包括它的CStudent类对象之前建立的在建立一个CStudent对象时,其构造函数自动被调用,那么参数又是如何传递给对象成员m_Birthday的构造函数的呢?第63页,本讲稿共70页64构造函数头部的语法形式构造函数头部的语法形式 CStudent:CStudent(char*strName,char*str

50、ID,char cSex,char*strMajor,int nYear,int nMonth,int nDay):m_Birthday(nYear,nMonth,nDay)m_strName=new charstrlen(strName)+1;strcpy(m_strName,strName);m_strID=new charstrlen(strID)+1;strcpy(m_strID,strID);m_cSex=cSex;m_strMajor=new charstrlen(strMajor)+1;strcpy(m_strMajor,strMajor);m_nCount+;这个构造函数有7个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁