第3讲类与对象优秀PPT.ppt
《第3讲类与对象优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第3讲类与对象优秀PPT.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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,“计计算机科学与技术算机科学与技术);Studen
2、t2.DisplayInfo();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)co
3、ut男男 ;elsecout女女 ;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_strM
4、ajor“软件工程软件工程”GetName()代码地址代码地址SetName()代码地址代码地址DisplayInfo()代码地址代码地址DisplayInfo()代码代码DisplayInfo()代码地址代码地址现在学习的是第6页,共70页7一个问题一个问题一个类中所有的对象调用的成员函数都是同一一个类中所有的对象调用的成员函数都是同一代码段。代码段。那么,成员函数又是怎么识别出当前调用自己那么,成员函数又是怎么识别出当前调用自己的是哪个对象,从而对该对象的数据成员而的是哪个对象,从而对该对象的数据成员而不是其他对象的数据成员进行处理呢?不是其他对象的数据成员进行处理呢?现在学习的是第7页,
5、共70页8This指针指针 C+中有一个特殊的指针中有一个特殊的指针this,称为自引用指针。这个指针,称为自引用指针。这个指针与类密切相关。与类密切相关。每当创建一个对象时,系统就把每当创建一个对象时,系统就把this指针初始化为指向该对指针初始化为指向该对象。象。C+为类的每个成员函数都提供了这个隐含的名字为为类的每个成员函数都提供了这个隐含的名字为this的指针参数:的指针参数:类名类名*const this因此可以说,因此可以说,指针指针this指向一个对象指向一个对象,该对象产生成员函,该对象产生成员函数的调用动作。数的调用动作。现在学习的是第8页,共70页9This指针指针 在成员
6、函数中,隐含了对在成员函数中,隐含了对this指针的使用。例如,成员函指针的使用。例如,成员函数数DisplayInfo()的定义被编译系统处理为:的定义被编译系统处理为: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而调用成员函数的语句则被编译系统处理成:而调用成员函数的语句则被编译
7、系统处理成:int main()CStudent Student1(张明张明,50201000901,0,软件工软件工程程);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_s
8、trName 的信息为:的信息为:endl;cout姓名:姓名:m_strName 编号:编号:m_strID 性别:性别:;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(张明张明,5020
9、1000901,0,软件工程软件工程);Student1.DisplayInfo();coutStudent1对象的地址为:对象的地址为:&Student1endl;CStudent Student2(李彤李彤,50201000911,1,计算机科学与技术计算机科学与技术);Student2.DisplayInfo();coutStudent2对象的地址为:对象的地址为:&Student2endl;return 0;现在学习的是第12页,共70页13程序运行结果程序运行结果现在学习的是第13页,共70页14使用使用this指针指针【例2-16】为案例程序添加一个拷贝函数,功能是将一个对象拷贝给
10、另外一个对象。#include using namespace std;class CStudent/学生类学生类public:void 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_strNa
11、me,Student.m_strName);delete m_strID;m_strID=new charstrlen(Student.m_strID)+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
12、,0,电子信息工电子信息工程程);CStudent Student2(张慧张慧,50201000902,1,软件工程软件工程);Student1.DisplayInfo();Student2.DisplayInfo();Student1.Copy(Student2);Student1.DisplayInfo();Student2.DisplayInfo();return 0;编译连接运行程序。编译连接运行程序。现在学习的是第16页,共70页17this指针的其他用途指针的其他用途当在类的非静态成员函数中返回类对象本身时,当在类的非静态成员函数中返回类对象本身时,可以直接使用可以直接使用retu
13、rn*this;。当成员函数的形参名与数据成员的变量名相同时,当成员函数的形参名与数据成员的变量名相同时,如果需要进行二者之间的赋值操作,可以通过如果需要进行二者之间的赋值操作,可以通过this指针进行区分。指针进行区分。例如:例如:this-n =n;而不能写成而不能写成:n=n;this-n是对象的数据成员,而n是成员函数的形参。现在学习的是第17页,共70页18静态数据成员与静态成员函数静态数据成员与静态成员函数现在学习的是第18页,共70页19学生人数的问题学生人数的问题 在在“大学人员信息管理系统大学人员信息管理系统”中,我们需要做一些统计中,我们需要做一些统计数据和分析数据的工作,
14、例如:数据和分析数据的工作,例如:统计学生的统计学生的人数人数;计算学生计算学生平均年龄平均年龄;计算学生的计算学生的平均成绩平均成绩;计算学生的计算学生的总成绩总成绩;这些数据的共同特点是:它们属于全体学生。那么这样的数据存放在哪里呢?不能存放在类中,因为类不是一个占有内存的实体。那么归哪个对象所有?一旦学生人数、总成绩等发生变化。要每个对象逐个修改?思考:如何解决?现在学习的是第19页,共70页20静态成员静态成员 当一个类的多个对象需要共享数据时,可以利用当一个类的多个对象需要共享数据时,可以利用静态数据静态数据成员成员和和静态成员函数静态成员函数来实现。来实现。例如,例如,学生人数学生
15、人数是和是和每一个学生对象每一个学生对象有关的(每次新建一有关的(每次新建一个学生对象,学生人数都应该增个学生对象,学生人数都应该增1),但它又不能只属),但它又不能只属于某一个学生对象,这时就可以将学生人数说明成于某一个学生对象,这时就可以将学生人数说明成类的静态数据成员,以实现学生对象之间的数据共类的静态数据成员,以实现学生对象之间的数据共享。享。现在学习的是第20页,共70页21【例2-17】利用静态数据成员统计学生的人数。利用静态数据成员统计学生的人数。class CStudent/学生类学生类static unsigned long m_nCount;/学生人数,静态数据成员学生人数
16、,静态数据成员private:public:unsigned long GetCount();CStudent:CStudent(char*strName,char*strID,char 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 ch
17、arstrlen(student.m_strName)+1;strcpy(m_strName,student.m_strName);m_strID=new charstrlen(student.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
18、 m_strID;delete m_strMajor;m_nCount-;在析构函数中进行学生人数的减一在拷贝构造函数中进行学生人数的增一现在学习的是第22页,共70页23unsigned long CStudent:GetCount()return m_nCount;unsigned long CStudent:m_nCount=0;int main()CStudent Student1(王晓天王晓天,50201000701,0,电子信息电子信息工程工程);cout学生人数为:学生人数为:Student1.GetCount()endl;CStudent Student2(张慧张慧,50201
19、000902,1,软件工程软件工程);cout学生人数为:学生人数为:Student2.GetCount()endl;CStudent Student3(Student1);cout学生人数为:学生人数为:Student3.GetCount()endl;return 0;获取静态数据成员的值静态数据成员的定义与初始化静态数据成员不能在任何函数内分配空间和初始化。必须将其放在类的内部实现部分中定义。定义时,要使用类名引导。现在学习的是第23页,共70页24说明说明(1)对静态数据成员的定义与初始化应在类外进行,通)对静态数据成员的定义与初始化应在类外进行,通常在类声明之后,主函数常在类声明之后,
20、主函数main之前进行。之前进行。在定义和初始化静态成员时,不必在前面添加关键字在定义和初始化静态成员时,不必在前面添加关键字static。(2)静态数据成员同静态变量一样,在编译时就被创建)静态数据成员同静态变量一样,在编译时就被创建和初始化。和初始化。现在学习的是第24页,共70页25静态成员函数静态成员函数 静态成员函数的主要作用是访问静态数据成静态成员函数的主要作用是访问静态数据成员。员。通过静态成员函数,可以通过静态成员函数,可以在对象建立之前在对象建立之前进进行静态数据成员的访问。行静态数据成员的访问。现在学习的是第25页,共70页26【例2-18】通过静态成员函数访问静态数据成员
21、。通过静态成员函数访问静态数据成员。class CStudent/学生类学生类static unsigned long m_nCount;/学生人数学生人数private:char*m_strName;/姓名姓名public:static unsigned long GetCount();/静态成员函数静态成员函数;声明时前面要写明static现在学习的是第26页,共70页27CStudent:CStudent(char*strName,char*strID,char cSex,char*strMajor)m_nCount+;CStudent:CStudent(const CStudent&s
22、tudent)m_nCount+;CStudent:CStudent()m_nCount-;unsigned long CStudent:GetCount()return m_nCount;定义时前面不需要加static现在学习的是第27页,共70页28unsigned long CStudent:m_nCount=0;int main()cout学生人数为:CStudent:GetCount()endl;CStudent Student1(王晓天王晓天,50201000701,0,电子信息电子信息工程工程);cout学生人数为:学生人数为:Student1.GetCount()endl;CS
23、tudent Student2(张慧张慧,50201000902,1,软件工程软件工程);cout学生人数为:学生人数为:Student2.GetCount()endl;CStudent Student3(Student1);cout学生人数为:学生人数为:Student3.GetCount()-静态成员函数名静态成员函数名(实参表实参表)由于类的静态成员函数是类的一部分,而不是某个对象的一部分,建议由于类的静态成员函数是类的一部分,而不是某个对象的一部分,建议在进行静态成员函数调用时,使用第在进行静态成员函数调用时,使用第种形式,以方便对程序的阅读种形式,以方便对程序的阅读与理解。与理解。现
24、在学习的是第31页,共70页32(3)静态成员函数与非静态成员函数的主要区别在于:非静态成员函)静态成员函数与非静态成员函数的主要区别在于:非静态成员函数有数有this指针,而静态成员函数指针,而静态成员函数没有没有this指针指针。由于静态成员函数属于类,没有由于静态成员函数属于类,没有this指针,因此静态成员函数指针,因此静态成员函数不能直接访问非静态成员,而应通过对象、对象指针或对象引不能直接访问非静态成员,而应通过对象、对象指针或对象引用间接地进行访问。例如:用间接地进行访问。例如:unsigned long CStudent:GetCount()SetSex(0);coutm_st
25、rNameendl;return m_nCount;说明说明 错误:不能在静态成员函数中直接调用非静态成员函数错误:不能在静态成员函数中访问非静态数据成员现在学习的是第32页,共70页33静态成员静态成员 静态成员是静态成员是C+里用来解决同一个类的不同对里用来解决同一个类的不同对象间的数据共享问题,静态成员包括:象间的数据共享问题,静态成员包括:静态数据成员静态数据成员静态成员函数静态成员函数 C+用静态数据成员来实现同一个类的不同对象间的数据共享,即不需要在每个对象中为这些公用数据单独开辟存储单元了。C+用静态数据成员来实现同一个类的不同对象间的数据共享,即不需要在每个对象中为这些公用数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对象 优秀 PPT
限制150内