版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主讲人:曹宣俊C+C+面向对象程序面向对象程序设计设计第1页/共41页2021-12-5目录 静态成员 类成员指针 this指针 子对象 堆对象 常对象 函数模板 类模板第2页/共41页类静态成员 静态成员分为:静态数据成员和静态成员函数 静态数据成员静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所共有的,只需存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样的,但是它的值是可以更新的。第3页/共41页静态数据成员定义方法 1,在一般数据成员前加关键字static 2,静态数据成员初始化与一般数据成员初始化不同。其初始化如下
2、:数据类型 类名:静态数据成员名= 值;这说明:初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。初始化时不加该成员的访问权限控制符private,public等初始化时使用作用域来表明它所属的类静态成员必须进行初始化。引用静态数据成员时,既可以通过对象引用,也可以采用如下格式:类名:静态数据成员名第4页/共41页示例程序class A static int a; ; void main() coutsizeof(A)endl; class Aint a; ; void main() coutsizeof(A)endl; 前者执行结果是1,后者是4.从而可见静态数据成
3、员节省内存空间第5页/共41页静态成员函数 静态成员函数是类的静态成员,而不是对象成员。 定义方式是在普通成员函数前加static 调用静态成员函数时既可以通过对象来调用,也可以通过类来调用。 在静态成员函数的实现中,不能直接引用类中说明的非静态成员,但是可以引用类中说明的静态数据成员。如果静态成员函数中要引用非静态成员时,则可通过对象来调用。第6页/共41页示例程序 class Samplprivate: int n; static int m;public:Sample(int i)n=i;m+=i; Static void disp(Sample c)cout“n=”c.n“,m=”me
4、ndl;;第7页/共41页示例程序 int Sample:m= 2;void main()Sample A(2),B(4);A.disp(B);/通过对象A调用静态成员函数Sample:disp(A);/通过类调用静态成员函数该程序的执行结果如下:n=4,m=8n=2,m=8第8页/共41页类成员指针 类成员指针包括类数据成员指针和类成员函数指针类数据成员指针一般定义格式如下:类型 类名:数据成员指针名由于类不是运行时存在的对象,因此,使用类数据成员指针时,需要首先指定类的一个数据成员,然后通过类的对象来引用指针所指向的成员。第9页/共41页示例程序(类数据成员指针)class Samplep
5、ublic:void disp()cout“m=”mendl;cout“n=”nendl;int m,n;/公有数据成员;void main()int Sample:*p = &Sample:m;Sample a;a.*p=10;/等价于a.m=10 第10页/共41页类成员函数指针 指向类成员函数的指针定义格式如下:类型(类名:*成员函数指针名)(参数表)给类成员函数指针赋值的格式如下:指向成员函数的指针名=函数名程序中使用指向函数的指针调用函数的格式如下:(*指向函数的指针名)(实参表)第11页/共41页示例程序 class Samplprivate: int n,m;public
6、:void setm(int i)n=i; void setn(int i) n=i; void disp()cout“n=”n“,m=”mendl;;void main()void (Sample:*pfub)(int);Sample a;pfun=Sample:setm;(a.*pfun)(10); /等价于a.setm(10);第12页/共41页this指针 在设计好一个类后,通过定义类对象来调用类的成员函数,其使用格式为:对象.成员函数在C+中,每个当前对象都隐含一个指向该对象的指针,即this指针。显然,this指针的类型就是成员函数所属的类的类型第13页/共41页示例程序class
7、 Samplprivate: int n;public:Sample(int m) n=m;void addvalue(int m)Sample s;s.n=n+m;*this = s;void disp()cout“n=”nn =s1.n+s2.n;return (*this); 第16页/共41页this指针 Attention: 静态成员函数没有this指针。因为类只有一个静态成员函数实例,所以使用this指针没有什么意义。在静态成员函数中使用this指针会引起编译错误,不然静态成员函数就会像非静态成员函数一样使用指针进行访问了。第17页/共41页子对象 当一个类的数据成员是另一个类的对
8、象时,这个对象就称为子对象。子对象可以像通过对象那样使用,唯一要考虑的是: 子对象构造函数和析构函数的执行次序。一般的,设类A含有子对象obj,该子对象对应的 类是B,如:class B;class AB obj;/obj是类B的对象,是类A的子对象。; 为了调用子对象obj的构造函数,设计类A的构造函数如下:A(参数表):obj(参数表2)函数体;第18页/共41页说明 当建立obj调用类B的不带参数的构造函数时,可省略obj() 当类A中有多个字对象时,在A构造函数”:“后列出各子对象的初始化表达式,它们之间用逗号分隔,称为子对象初始化列表。 A构造函数的执行 次序是,以子对象在类A中说明
9、的顺序调用子对象初始化列表中列出的各构造函数,然后执行函数体。第19页/共41页示例程序class Bint b;public:B()b=1;void printb()coutb=bendl;class Aint a;B c;public:A(int i) a=i;void printa()couta=aendl;c.printb();void main()A a(2);a.printa();第20页/共41页说明 该程序中,类A有一个子对象c,它是类B的对象。由于建立c子对象调用类B的不带参数的构造函数,所以类A构造函数没有给出c().对于A a(2)语句,执行类A的构造函数,其过程是:先调
10、用B类构造函数,给赋值1,再执行a=2.本程序执行结构是 a =2 b =1第21页/共41页析构函数 在含有子对象的类A中,设计析构函数如下: A()函数体; 其执行次序是:先执行函数体,再以子对象在类A中说明的相反次序调用各类的析构函数第22页/共41页示例程序class B1public:B1()coutB1:Constructorendl;B1()coutB1:Descontructorendl;class B2public:B2()coutB2:Constructorendl;B2()coutB2:Descontructorendl;class B3public:B3()coutB3
11、:Constructorendl;B3()coutB3:Descontructorendl;class A B1 b1;B2 b2;B3 b3;public:A():b3(),b2(),b1()coutAendl;A()coutA:Descontructorendl;void main()A a;第23页/共41页程序分析 程序中定义了四个类,类A中含有3个子对象b1,b2,b3, 分别是类B1,B2,B3的对象,其说明次序是b1,b2,b3, 按照子对象构造函数和析构函数的执行次序得到以下的程序运行结果 B1:Constructor B2:Constructor B3:Constructor
12、 A:Constructor A:Destructor B1:Destructor B2:Destructor B3:Destructor第24页/共41页堆对象 所谓堆对象是指在程序运行过程中根据需要随时建立或删除的对象。这种堆对象被创建在内存一些空闲的存储单元中,这些存储单元称为堆。它们可以被创建的堆对象占有,也可以通过删除堆对象而获得释放。 创建或删除堆对象时,需要如下两个运算符:new 或delete这两个运算符又称为动态分配内存空间运算符。new相当于C语言的malloc()函数,delete相当于C语言的free()函数第25页/共41页运算符new的用法 运算符new的用法 该运
13、算符的功能是用来创建堆对象,或者说,它是用来动态地创建对象。new运算符使用格式如下: new 类型说明符(初始化列表) 它说明在堆中建立一个由类型说明符给定的类型的对象时,并且由括号中的初始值列表 给出被创建对象的初始值.如果省去括号和括号中的初始值,则被创建的对象选用默认值. 使用new运算符创建对象时,可以根据其参数来选择适当的构造函数,不需要sizeof来计算对象所占用的 字节数,便可以计算其大小. new运算符返回一个指针,指针类型将与new所分配对象相匹配,如果不匹配要通过强制类型转换,否则将出现编译错误. 如果new运算符不能分配到所需要的内存,它将返回0,这时的指针为空指针.
14、new运算符也可以来创建数组类型的对象,即对象数组,其格式如下: new 类名算术表达式第26页/共41页 其中,算术表达式的值为所创建的对象数组的大小.例如: A* ptr; ptr = new A5; 其中,A是一个已知的类名,ptr指向类A对象的一个指针.通过new A5创建一个对象数组,该数组有5个元素.它的返回值赋给指针ptr,于是 ptr便指向对象数组的指针. 使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为默认值. 注意: (1)用new创建对象时,要调用构造函数. (2)使用new来创建对象数组时,类中必须说明默认默认构造函数 (3)使用new创建类sam
15、ple的对象数组Samplen时,系统调用默认构造函数n次.第27页/共41页运算符delete的用法该运算符的功能是用来删除使用new创建的对象或一般类型的指针.其格式如下: delete 例如: A* ptr; ptr=new A(5,6);delete ptr; 其中,ptr是一个指向类A的指针,使用new给ptr分配了内存空间,又使用了delete删除了指针ptr. 运算符delete也可以用来删除使用new创建的对象数组,其使用格式如下: delete 指针名例如: A* ptr; ptr = new A5; delete ptr; 其中,ptr指向类A对象的指针.它被赋值为指向一个
16、具有5个元素的类A的对象数组的首元素.使用delete删除了这个数组.第28页/共41页运算符delete的用法 注意: (1)运算符delete必须使用于由运算符new返回的指针. (2)该运算符也适用于空指针(即其值为0的指针) (3)对一个指针只能使用一次delete操作 (4)指针名前只用一对括号符,并且不管所删除数组的维数,忽略方括号内的任何数字. (5)用delete删除对象时,要调用析构函数 (6)使用delete删除对象数组时,该数组由多少元素,就调用析构函数多少次.第29页/共41页常类型 常类型是指用类型修饰符const修饰说明的类型,常类型的变量或对象的值是不能更新的,所
17、以能够达到 既保证数据共享,又防止改变数据的目的. 常对象 常对象是指对象常量,定义格式如下: 类名 const 对象名 或者 const 类名 对象名 在定义常对象时必须进行初始化,而且该对象不能再被更新.第30页/共41页常类型 例如,有以下程序: class Sample int n; public:Sample(int i)n=i;void setvalue(int i)n=i;void display()coutn=endl; ; void main() const Sample a(10);a.setvalue(6);a.display(); 第31页/共41页常类型 本程序中有两
18、个错误,第一个错误是a.setvalue(6);语句,错误信息是error C2662:setvalue:cannot convert this pointer from const class Sample to class Sample&,即常对象不能被更新(setvalue成员函数修改数据成员). 第二个错误是a.display()语句,错误信息是error C2662:display:cannot convert this pointer from const class Sample to class Sample &,该错误也是由于常对象a不能被更新,尽管disla
19、y() 没有修改常对象a. 第32页/共41页常对象成员 常成员函数使用const关键字说明的函数称为常成员函数,常成员函数的说明格式如下:数据类型 函数名(参数表) const注意:(1)const是函数类型的一个组成部分,因此在实现部分也要带const关键字。(2)常成员函数不更新对象的数据成员,也不能调用该类没有用const修饰的成员函数。(3)如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。(4)const可以被用于参与对重载函数的区分。例如类中有如下说明:Void print()Void print ()const第33页/共41页示例程序
20、class Sample int n; public:Sample(int i)n=i;void print()cout1:n=nendl;void print()const cout2:n=nendl; ; void main() Sample a(10);const Sample b(20);a.print();b.print();第34页/共41页程序说明 本程序的执行结果是1:n=10 2:n=20 本程序中Sample类中说明了两个同名函数print,其中一个是常函数,在主函数中 说明了两个对象a和b,其中对象b是常对象,通过对象a调用的是没有const修饰的 函数,而通过对象b调用的是用const修饰的常函数第35页/共4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校消防演练总结10篇
- 初中感动中国读后感作文
- 建筑实习生工作总结
- 学生专业实习报告锦集8篇
- 高一军训心得体会(合集15篇)
- 事务所实习报告【7篇】
- 小学数学教研工作总结10篇
- 行政文员实习报告2000字
- 酒店员工食品安全培训
- 小学生《我和我的家乡》观后感
- 2024年七年级上册历史期末常考问答题
- 阳光雨棚制作安装合同范本
- 2024-2030年中国电力信息化行业市场深度调研及发展趋势与投资前景研究报告
- 3班主任基本功竞赛:主题班会《我本是高山》教学课件
- 拜占庭历史与文化智慧树知到期末考试答案章节答案2024年南开大学
- 【金融模拟交易实践报告4600字】
- 三会一课检查方案
- 铁矿选矿厂生产承包合同
- 燃气经营安全重大隐患判定标准课件
- 网络营销智慧树知到期末考试答案章节答案2024年对外经济贸易大学
- 第7章 无人机操纵
评论
0/150
提交评论