C++基础知识及MFC课件第3讲类与对象2章节

上传人:E**** 文档编号:91228435 上传时间:2019-06-26 格式:PPT 页数:44 大小:360KB
返回 下载 相关 举报
C++基础知识及MFC课件第3讲类与对象2章节_第1页
第1页 / 共44页
C++基础知识及MFC课件第3讲类与对象2章节_第2页
第2页 / 共44页
C++基础知识及MFC课件第3讲类与对象2章节_第3页
第3页 / 共44页
C++基础知识及MFC课件第3讲类与对象2章节_第4页
第4页 / 共44页
C++基础知识及MFC课件第3讲类与对象2章节_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《C++基础知识及MFC课件第3讲类与对象2章节》由会员分享,可在线阅读,更多相关《C++基础知识及MFC课件第3讲类与对象2章节(44页珍藏版)》请在金锄头文库上搜索。

1、1,第3讲 类与对象(2),2,本讲主要内容,1. this指针 2. 静态数据成员与静态成员函数 3. 友元 4. 类对象作为成员,3,【例2-15】 this指针的引入,4,class CPoint public: void PrintInfo(); ; void CPoint:PrintInfo() cout“x=“x“ “y=“yendl; int main() CPoint point1, point2; point1.SetPoint(10, 20); point2.SetPoint(50, 50); cout“point1:“endl; point1.PrintInfo(); c

2、out“point2:“endl; point2.PrintInfo(); return 0; ,函数PrintInfo是如何知道该输出哪一个对象的数据成员x和y呢?,5,this指针,C+为类的每个成员函数都提供了一个隐含的名字为this的指针参数: 类名* const this 在成员函数中,隐含了对this指针的使用。例如,成员函数PrintInfo的定义被编译系统处理为: void CPoint:PrintInfo(CPoint* const this) coutxyendl; 而语句“point1.PrintInfo()”,被编译系统处理成: PrintInfo(,6,【例2-16】

3、 输出this指针的值,7, void CPoint:SetPoint(int m, int n) this-x = m; this-y = n; void CPoint:PrintInfo() coutxyendl; int main() CPoint point1, point2; point1.SetPoint(10, 20); point2.SetPoint(50, 50); cout“point1:“endl; cout“point1对象的地址为:“ ,程序运行结果,可以通过this指针访问数据成员,8,this指针的用途,【例2-17】 this指针的使用 #include usi

4、ng namespace std; class CStudent /学生类 public: void Copy(CStudent ,进行两个学生对象之间的拷贝,9,void CStudent:Copy(CStudent ,10,int main() CStudent Student1(“王晓天“, “50201000701“, 0, “电子信息工程“); CStudent Student2(“张慧“, “50201000902“, 1, “软件工程“); Student1.Copy(Student2); Student1.GetName(strName); Student1.GetID(str

5、ID); Student1.GetSex( ,11,this指针的其他用途,(1)当在类的非静态成员函数中返回类对象本身时,可以直接使用return *this;。 (2)当成员函数的形参名与数据成员的变量名相同时,如果需要进行二者之间的赋值操作,可以通过this指针进行区分。 例如: this-n = n; 而不能写成: n = n;,this-n是对象的数据成员,而n是成员函数的形参。,12,静态数据成员和静态成员函数,13,静态数据成员,当一个类的多个对象需要进行数据共享时,可以通过静态数据成员和静态成员函数进行实现。 例如,学生人数是和每一个学生对象有关的(每次新建一个学生对象,学生人

6、数都应该增1),但它又不能只属于某一个学生对象,这时就可以将学生人数说明成类的静态数据成员,以实现学生对象之间的数据共享。,14,【例2-18】 利用静态数据成员统计学生的人数,15, class CStudent /学生类 static unsigned long m_nCount; /学生人数,静态数据成员 private: public: unsigned long GetCount(); ; CStudent:CStudent(char* strName, char* strID, char cSex, char* strMajor) m_strName = new charstrle

7、n(strName)+1; strcpy(m_strName, strName); m_nCount+; ,静态数据成员,在构造函数中增加学生的人数,关键字,16,CStudent:CStudent(const CStudent ,在析构函数中进行学生人数的减一,在拷贝构造函数中进行学生人数的增一,17, unsigned long CStudent:GetCount() return m_nCount; unsigned long CStudent:m_nCount = 0; int main() CStudent Student1(“王晓天“, “50201000701“, 0, “电子信

8、息工程“); cout“学生人数为:“Student1.GetCount()endl; CStudent Student2(“张慧“, “50201000902“, 1, “软件工程“); cout“学生人数为:“Student2.GetCount()endl; CStudent Student3(Student1); cout“学生人数为:“Student3.GetCount()endl; return 0; ,获取静态数据成员的值,静态数据成员的定义与初始化,调用了拷贝构造函数,程序的运行结果: 学生人数为:1 学生人数为:2 学生人数为:3,18,说明,(1)对静态数据成员的定义与初始化

9、应在类外进行,通常在类声明之后,主函数main之前进行。 在定义和初始化静态成员时,不必在前面添加关键字static。 (2)静态数据成员同静态变量一样,在编译时就被创建和初始化。,19,静态成员函数,静态成员函数的主要作用是访问静态数据成员。通过静态成员函数,可以在对象建立之前进行静态数据成员的访问。,20,【例2-19】 通过静态成员函数访问静态数据成员, class CStudent /学生类 static unsigned long m_nCount; /学生人数 private: char *m_strName; /姓名 public: static unsigned long Ge

10、tCount(); /静态成员函数 ;,21,CStudent:CStudent(char* strName, char* strID, char cSex, char* strMajor) m_nCount+; CStudent:CStudent(const CStudent ,22,unsigned long CStudent:m_nCount = 0; int main() cout“学生人数为:“CStudent:GetCount()endl; CStudent Student1(“王晓天“, “50201000701“, 0, “电子信息工程“); cout“学生人数为:“Stude

11、nt1.GetCount()endl; CStudent Student2(“张慧“, “50201000902“, 1, “软件工程“); cout“学生人数为:“Student2.GetCount()endl; CStudent Student3(Student1); cout“学生人数为:“Student3.GetCount()endl; return 0; ,在对象定义之前就可以调用静态成员函数,23,说明,(1)静态成员函数的声明形式为: static 返回类型 静态成员函数名(参数表); (2)当静态成员函数是公有成员函数时,主要有以下三种调用形式: 类名:静态成员函数名(实参表)

12、 对象名. 静态成员函数名(实参表) 对象指针名-静态成员函数名(实参表) 由于类的静态成员函数是类的一部分,而不是某个对象的一部分,建议在进行静态成员函数调用时,使用第种形式,以方便对程序的阅读与理解。,24,(3)静态成员函数与非静态成员函数的主要区别在于:非静态成员函数有this指针,而静态成员函数没有this指针。 由于静态成员函数属于类,没有this指针,因此静态成员函数不能直接访问非静态成员,而应通过对象、对象指针或对象引用间接地进行访问。例如: unsigned long CStudent:GetCount() SetSex(0); coutm_strNameendl; retu

13、rn m_nCount; ,说明,错误:不能在静态成员函数中直接调用非静态成员函数,错误:不能在静态成员函数中访问非静态数据成员,25,友元,类的主要目的之一是实现信息的隐藏与封装,即类的私有成员在类的外部不可见,不能直接进行访问,只能通过对外的接口函数间接地进行访问。但这样往往会降低对私有数据成员的访问效率。 有时候,某些特殊的函数或类需要对这些私有成员进行直接访问,这时,就需要打破类的封装。这种能够对类的私有成员直接进行访问的外部类或外部函数被称为(类的)友元。 友元可分为友元函数和友元类。其中友元函数既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。 声明友元的关键字是fri

14、end。,26,非成员函数作为友元,【例2-20】 比较两个学生的姓名是否相同,27, class CStudent /学生类 private: char *m_strName;/姓名 public: / friend bool CompareName(CStudent ,友元函数,友元函数可以直接访问类对象的私有成员,28, int main() CStudent Student1(“王晓天“, “50201000701“, 0, “电子信息工程“); CStudent Student2(“张慧“, “50201000902“, 1, “软件工程“); if(CompareName(Stud

15、ent1, Student2) = true) cout“Student1和Student2的姓名相同“endl; else cout“Student1和Student2的姓名不相同“endl; return 0; ,29,类的成员函数作为另一个类的友元,【例2-21】 类的成员函数作为友元,30,#include using namespace std; class CA; class CB public: void CBModifyCA(CA ,提前引用说明,因为类CB中用到了类CA,类CB的成员函数CBModifyCA是类CA的友元函数,31,void CB:CBModifyCA(CA

16、,类CA的友元函数可以直接访问CA对象的私有成员,程序的运行结果: X=2.2 y=3.3 X=4.2 y=6.3,32,友元类,可以将一个类作为另一个类的友元,称为友元类。一个类的友元类的所有成员函数都可以访问该类的所有成员。,33,【例2-22】 友元类的使用,#include using namespace std; class CA; /提前引用说明,因为类CB中用到了类CA class CB public: void CBModifyCA(CA ,类CB是类CA的友元,34,void CB:CBModifyCA(CA ,类CA的友元类的成员函数可以直接访问CA对象的私有成员,类CA的友元类的成员

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号