技能培训四教案资料

上传人:yuzo****123 文档编号:138657858 上传时间:2020-07-16 格式:PPT 页数:41 大小:682KB
返回 下载 相关 举报
技能培训四教案资料_第1页
第1页 / 共41页
技能培训四教案资料_第2页
第2页 / 共41页
技能培训四教案资料_第3页
第3页 / 共41页
技能培训四教案资料_第4页
第4页 / 共41页
技能培训四教案资料_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《技能培训四教案资料》由会员分享,可在线阅读,更多相关《技能培训四教案资料(41页珍藏版)》请在金锄头文库上搜索。

1、2020/7/16,主讲人:曹宣俊,C+面向对象程序设计,2020/7/16,目录,静态成员 类成员指针 this指针 子对象 堆对象 常对象 函数模板 类模板,2020/7/16,类静态成员,静态成员分为:静态数据成员和静态成员函数 静态数据成员 静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所共有的,只需存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样的,但是它的值是可以更新的。,2020/7/16,静态数据成员定义方法,1,在一般数据成员前加关键字static 2,静态数据成员初始化与一般数据成员初始化不同。其初始化

2、如下: 数据类型 类名:静态数据成员名= 值; 这说明:初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。 初始化时不加该成员的访问权限控制符private,public等 初始化时使用作用域来表明它所属的类 静态成员必须进行初始化。 引用静态数据成员时,既可以通过对象引用,也可以采用如下格式: 类名:静态数据成员名,2020/7/16,静态成员函数,静态成员函数是类的静态成员,而不是对象成员。 定义方式是在普通成员函数前加static 调用静态成员函数时既可以通过对象来调用,也可以通过类来调用。 在静态成员函数的实现中,不能直接引用类中说明的非静态成员,但是可以引用

3、类中说明的静态数据成员。如果静态成员函数中要引用非静态成员时,则可通过对象来调用。,2020/7/16,示例程序,class Sampl private: int n; static int m; public: Sample(int i) n=i; m+=i; Static void disp(Sample c) cout“n=”c.n“,m=”mendl; ;,2020/7/16,示例程序,int Sample:m= 2; void main() Sample A(2),B(4); A.disp(B);/通过对象A调用静态成员函数 Sample:disp(A);/通过类调用静态成员函数 该

4、程序的执行结果如下: n=4,m=8 n=2,m=8,2020/7/16,类成员指针,类成员指针 包括类数据成员指针和类成员函数指针 类数据成员指针一般定义格式如下: 类型 类名:数据成员指针名 由于类不是运行时存在的对象,因此,使用类数据成员指针时,需要首先指定类的一个数据成员,然后通过类的对象来引用指针所指向的成员。,2020/7/16,示例程序(类数据成员指针),class Sample public: void disp() cout“m=”mendl; cout“n=”nendl; int m,n;/公有数据成员 ; void main() int Sample:*p = /等价于a

5、.m=10 ,2020/7/16,类成员函数指针,指向类成员函数的指针定义格式如下: 类型(类名:*成员函数指针名)(参数表) 给类成员函数指针赋值的格式如下: 指向成员函数的指针名=函数名 程序中使用指向函数的指针调用函数的格式如下: (*指向函数的指针名)(实参表),2020/7/16,示例程序,class Sampl private: int n,m; public: void setm(int i)n=i; void setn(int i) n=i; void disp() cout“n=”n“,m=”mendl; ; void main() void (Sample:*pfub)(i

6、nt); Sample a; pfun=Sample:setm; (a.*pfun)(10);/等价于a.setm(10); ,2020/7/16,this指针,在设计好一个类后,通过定义类对象来调用类的成员函数,其使用格式为: 对象.成员函数 在C+中,每个当前对象都隐含一个指向该对象的指针,即this指针。显然,this指针的类型就是成员函数所属的类的类型,2020/7/16,示例程序,class Sampl private: int n; public: Sample(int m) n=m; void addvalue(int m) Sample s; s.n=n+m; *this =

7、s; void disp() cout“n=”nendl; ; void main() Sample s(10); s.disp(); s.addvalue(5); s.disp(); ,2020/7/16,示例程序进行说明,本程序执行的结果是n=10,n=15 上述程序中,Sample类中定义了一个addvalue非静态成员函数,语句 s.addvalue(5); 通过对象s来调用addvalue()成员函数,其中隐含一个指向对象s的指针,该语句告诉系统是将s对象的私有数据成员n增大5,而不是其他对象。它实际上相当于以下函数调用:addvalue( 即将类对象的地址作为第一个参数传递给了函数

8、。addvalue函数的原型实际是:void addvlue(Sample *this,int m)。该函数的第一个参数指向该类对象的一个指针,即this指针。我们定义该成员函数时,并没有看到这样一个参数,因为这个参数是系统隐含的。在成员函数的定义体中,可以通过this访问这一参数。,2020/7/16,this指针,this指针只能在类的成员函数中使用,它指向该成员函数被调用的对象。 示例程序 class Sample int n; public: Sample add(Sample s1,Sample s2) this-n =s1.n+s2.n; return (*this); ;,202

9、0/7/16,this指针,Attention: 静态成员函数没有this指针。因为类只有一个静态成员函数实例,所以使用this指针没有什么意义。在静态成员函数中使用this指针会引起编译错误,不然静态成员函数就会像非静态成员函数一样使用指针进行访问了。,2020/7/16,子对象,当一个类的数据成员是另一个类的对象时,这个对象就称为子对象。子对象可以像通过对象那样使用,唯一要考虑的是: 子对象构造函数和析构函数的执行次序。 一般的,设类A含有子对象obj,该子对象对应的 类是B,如: class B ; class A B obj;/obj是类B的对象,是类A的子对象 。 ; 为了调用子对象

10、obj的构造函数,设计类A的构造函数如下: A(参数表):obj(参数表2)函数体;,2020/7/16,说明,当建立obj调用类B的不带参数的构造函数时,可省略obj() 当类A中有多个字对象时,在A构造函数”:“后列出各子对象的初始化表达式,它们之间用逗号分隔,称为子对象初始化列表。 A构造函数的执行 次序是,以子对象在类A中说明的顺序调用子对象初始化列表中列出的各构造函数,然后执行函数体。,2020/7/16,示例程序,class B int b; public: B()b=1; void printb()coutb=bendl; ; class A int a; B c; public

11、: A(int i) a=i; void printa() couta=aendl; c.printb(); ; void main() A a(2); a.printa(); ,2020/7/16,说明,该程序中,类A有一个子对象c,它是类B的对象。由于建立c子对象调用类B的不带参数的构造函数,所以类A构造函数没有给出c().对于A a(2)语句,执行类A的构造函数,其过程是:先调用B类构造函数,给c.b赋值1,再执行a=2.本程序执行结构是 a =2 b =1,2020/7/16,析构函数,在含有子对象的类A中,设计析构函数如下: A()函数体; 其执行次序是:先执行函数体,再以子对象在类

12、A中说明的相反次序调用各类的析构函数,2020/7/16,示例程序,class B1 public: B1()coutB1:Constructorendl; B1()coutB1:Descontructorendl; ; class B2 public: B2()coutB2:Constructorendl; B2()coutB2:Descontructorendl; ; class B3 public: B3()coutB3:Constructorendl; B3()coutB3:Descontructorendl; ; class A B1 b1; B2 b2; B3 b3; public

13、: A():b3(),b2(),b1()coutAendl; A()coutA:Descontructorendl; ; void main() A a; ,2020/7/16,程序分析,程序中定义了四个类,类A中含有3个子对象b1,b2,b3, 分别是类B1,B2,B3的对象,其说明次序是b1,b2,b3, 按照子对象构造函数和析构函数的执行次序得到以下的程序运行结果 B1:Constructor B2:Constructor B3:Constructor A:Constructor A:Destructor B1:Destructor B2:Destructor B3:Destructor

14、,2020/7/16,堆对象,所谓堆对象是指在程序运行过程中根据需要随时建立或删除的对象。这种堆对象被创建在内存一些空闲的存储单元中,这些存储单元称为堆。它们可以被创建的堆对象占有,也可以通过删除堆对象而获得释放。 创建或删除堆对象时,需要如下两个运算符: new 或delete 这两个运算符又称为动态分配内存空间运算符。new相当于C语言的malloc()函数,delete相当于C语言的free()函数,2020/7/16,运算符new的用法,运算符new的用法 该运算符的功能是用来创建堆对象,或者说,它是用来动态地创建对象。new运算符使用格式如下: new 类型说明符(初始化列表) 它说

15、明在堆中建立一个由类型说明符给定的类型的对象时,并且由括号中的初始值列表 给出被创建对象的初始值.如果省去括号和括号中的初始值,则被创建的对象选用默认值. 使用new运算符创建对象时,可以根据其参数来选择适当的构造函数,不需要sizeof来计算对象所占用的 字节数,便可以计算其大小. new运算符返回一个指针,指针类型将与new所分配对象相匹配,如果不匹配要通过强制类型转换,否则将出现编译错误. 如果new运算符不能分配到所需要的内存,它将返回0,这时的指针为空指针. new运算符也可以来创建数组类型的对象,即对象数组,其格式如下: new 类名算术表达式,2020/7/16,其中,算术表达式

16、的值为所创建的对象数组的大小.例如: A* ptr; ptr = new A5; 其中,A是一个已知的类名,ptr指向类A对象的一个指针.通过new A5创建一个对象数组,该数组有5个元素.它的返回值赋给指针ptr,于是 ptr便指向对象数组的指针. 使用new创建对象数组或一般数组时,不能为该数组指定初始值,其初始值为默认值. 注意: (1)用new创建对象时,要调用构造函数. (2)使用new来创建对象数组时,类中必须说明默认默认构造函数 (3)使用new创建类sample的对象数组Samplen时,系统调用默认构造函数n次.,2020/7/16,运算符delete的用法,该运算符的功能是用来删除使用new创建的对象或一般类型的指针.其格式如下: delete 例如: A* ptr; ptr=new A(5,6); delete ptr; 其中,ptr是一个指向类A的指针,使用n

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

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

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