C++面向对象程序设计--技能四.ppt

上传人:s****8 文档编号:67255268 上传时间:2022-12-24 格式:PPT 页数:41 大小:1MB
返回 下载 相关 举报
C++面向对象程序设计--技能四.ppt_第1页
第1页 / 共41页
C++面向对象程序设计--技能四.ppt_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《C++面向对象程序设计--技能四.ppt》由会员分享,可在线阅读,更多相关《C++面向对象程序设计--技能四.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、主讲人:曹宣俊C+面向对象程序设计面向对象程序设计2022/12/222022/12/22目录目录v静态成员v类成员指针vthis指针v子对象v堆对象v常对象v函数模板v类模板2022/12/22类静态成员类静态成员静态成员分为:静态数据成员和静态成员函数静态成员分为:静态数据成员和静态成员函数静态数据成员静态数据成员静态数据成员是类的所有对象共享的成员,而不静态数据成员是类的所有对象共享的成员,而不是某个对象的成员。使用静态数据成员可以节省是某个对象的成员。使用静态数据成员可以节省内存,因为它是所有对象所共有的,只需存储一内存,因为它是所有对象所共有的,只需存储一处,供所有对象共用。静态数据

2、成员的值对每个处,供所有对象共用。静态数据成员的值对每个对象都是一样的,但是它的值是可以更新的。对象都是一样的,但是它的值是可以更新的。2022/12/222022/12/22静态数据成员定义方法静态数据成员定义方法 1 1,在一般数据成员前加关键字,在一般数据成员前加关键字staticstatic 2 2,静态数据成员初始化与一般数据成员初始化不同。其,静态数据成员初始化与一般数据成员初始化不同。其初始化如下:初始化如下:数据类型数据类型 类名类名:静态数据成员名静态数据成员名=值;值;这说明:初始化在类体外进行,而前面不加这说明:初始化在类体外进行,而前面不加staticstatic,以免

3、与,以免与一般静态变量或对象相混淆。一般静态变量或对象相混淆。初始化时不加该成员的访问权限控制符初始化时不加该成员的访问权限控制符privateprivate,publicpublic等等初始化时使用作用域来表明它所属的类初始化时使用作用域来表明它所属的类静态成员必须进行初始化。静态成员必须进行初始化。引用静态数据成员时,既可以通过对象引用,也可以采用引用静态数据成员时,既可以通过对象引用,也可以采用如下格式:如下格式:类名类名:静态数据成员名静态数据成员名2022/12/222022/12/22示例程序示例程序 class Aclass A static static intint a;a;

4、void main()void main()coutcoutsizeof(Asizeof(A)endlendl;class Aclass A intint a;a;void main()void main()coutcoutsizeof(Asizeof(A)endlendl;前者执行结果是前者执行结果是1 1,后者是,后者是4.4.从而可见静态数据成员节省内存空间从而可见静态数据成员节省内存空间2022/12/222022/12/22静态成员函数静态成员函数静态成员函数是类的静态成员,而不是对象成员。定义方式是在普通成员函数前加static调用静态成员函数时既可以通过对象来调用,也可以通过类来

5、调用。在静态成员函数的实现中,不能直接引用类中说明的非静态成员,但是可以引用类中说明的静态数据成员。如果静态成员函数中要引用非静态成员时,则可通过对象来调用。2022/12/222022/12/22示例程序示例程序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=”mendl;;2022/12/222022/12/22示例程序示例程序int Sample:m=2;void main()Sample A(2),B(4);A.disp

6、(B);/通过对象A调用静态成员函数Sample:disp(A);/通过类调用静态成员函数该程序的执行结果如下:n=4,m=8n=2,m=82022/12/222022/12/22类成员指针类成员指针类成员指针包括类数据成员指针和类成员函数指针类数据成员指针一般定义格式如下:类型 类名:数据成员指针名由于类不是运行时存在的对象,因此,使用类数据成员指针时,需要首先指定类的一个数据成员,然后通过类的对象来引用指针所指向的成员。2022/12/222022/12/22示例程序(类数据成员指针)示例程序(类数据成员指针)class Samplepublic:void disp()cout“m=”me

7、ndl;cout“n=”nendl;int m,n;/公有数据成员公有数据成员;void main()int Sample:*p=&Sample:m;Sample a;a.*p=10;/等价于等价于a.m=10 2022/12/222022/12/22类成员函数指针类成员函数指针指向类成员函数的指针定义格式如下:指向类成员函数的指针定义格式如下:类型(类名类型(类名:*成员函数指针名)(参数表)成员函数指针名)(参数表)给类成员函数指针赋值的格式如下:给类成员函数指针赋值的格式如下:指向成员函数的指针名指向成员函数的指针名=函数名函数名程序中使用指向函数的指针调用函数的格式程序中使用指向函数的

8、指针调用函数的格式如下:如下:(*指向函数的指针名)(实参表)指向函数的指针名)(实参表)2022/12/222022/12/22示例程序示例程序 class class SamplSampl private:private:intint n,mn,m;public:public:void void setm(intsetm(int i)ni)n=i;=i;void void setn(intsetn(int i)n=i;i)n=i;void void dispdisp()()coutcout“n=”n“,m=”m“n=”n“,m=”mendlendl;;void main()void mai

9、n()void(Sample:*void(Sample:*pfub)(intpfub)(int););Sample a;Sample a;pfunpfun=Sample:setmSample:setm;(a.*pfun)(10);(a.*pfun)(10);/等价于等价于a.setm(10);a.setm(10);2022/12/222022/12/22this指针指针在设计好一个类后,通过定义类对象来调用类的成员函数,其使用格式为:对象.成员函数在C+中,每个当前对象都隐含一个指向该对象的指针,即this指针。显然,this指针的类型就是成员函数所属的类的类型 2022/12/222022/

10、12/22示例程序示例程序 class class SamplSampl private:private:intint n;n;public:public:Sample(intSample(int m)n=m;m)n=m;void void addvalue(intaddvalue(int m)m)Sample s;Sample s;s.ns.n=n+mn+m;*this=s;*this=s;void void dispdisp()()coutcout“n=”n“n=”nn=s1.n+s2.n;this-n=s1.n+s2.n;return(*this);return(*this);2022/

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

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

13、oid void printb()coutprintb()coutb=bb=bendlendl;class Aclass A intint a;a;B c;B c;public:public:A(intA(int i)a=i;i)a=i;void void printaprinta()()coutcouta=aa=aendlendl;c.printbc.printb();();void main()void main()A a(2);A a(2);a.printaa.printa();();2022/12/222022/12/22说明说明该程序中,类A有一个子对象c,它是类B的对象。由于建立c

14、子对象调用类B的不带参数的构造函数,所以类A构造函数没有给出c().对于A a(2)语句,执行类A的构造函数,其过程是:先调用B类构造函数,给c.b赋值1,再执行a=2.本程序执行结构是a=2b=12022/12/222022/12/22析构函数析构函数在含有子对象的类A中,设计析构函数如下:A()函数体;其执行次序是:先执行函数体,再以子对象在类A中说明的相反次序调用各类的析构函数2022/12/222022/12/22示例程序示例程序 class B1class B1 public:public:B1()coutB1:ConstructorB1()coutB1:Constructorend

15、lendl;B1()coutB1:DescontructorB1()coutB1:Descontructorendlendl;class B2class B2 public:public:B2()coutB2:ConstructorB2()coutB2:Constructorendlendl;B2()coutB2:DescontructorB2()coutB2:Descontructorendlendl;class B3class B3 public:public:B3()coutB3:ConstructorB3()coutB3:Constructorendlendl;B3()coutB3:D

16、escontructorB3()coutB3:Descontructorendlendl;class A class A B1 B1 b1b1;B2 B2 b2b2;B3 B3 b3b3;public:public:A():b3(),b2(),b1()coutAA():b3(),b2(),b1()coutAendlendl;A()coutA()coutA:DescontructorA:Descontructorendlendl;void main()void main()A a;A a;2022/12/222022/12/22程序分析程序分析程序中定义了四个类,类A中含有3个子对象b1,b2,

17、b3,分别是类B1,B2,B3的对象,其说明次序是b1,b2,b3,按照子对象构造函数和析构函数的执行次序得到以下的程序运行结果B1:ConstructorB2:ConstructorB3:ConstructorA:ConstructorA:DestructorB1:DestructorB2:DestructorB3:Destructor2022/12/222022/12/22堆对象堆对象所谓堆对象是指在程序运行过程中根据需要随时所谓堆对象是指在程序运行过程中根据需要随时建立或删除的对象。这种堆对象被创建在内存一建立或删除的对象。这种堆对象被创建在内存一些空闲的存储单元中,这些存储单元称为堆。

18、它些空闲的存储单元中,这些存储单元称为堆。它们可以被创建的堆对象占有,也可以通过删除堆们可以被创建的堆对象占有,也可以通过删除堆对象而获得释放。对象而获得释放。创建或删除堆对象时,需要如下两个运算符:创建或删除堆对象时,需要如下两个运算符:new new 或或deletedelete这两个运算符又称为动态分配内存空间运算符。这两个运算符又称为动态分配内存空间运算符。newnew相当于相当于C C语言的语言的mallocmalloc()函数,()函数,deletedelete相相当于当于C C语言的语言的freefree()函数()函数2022/12/222022/12/22运算符运算符new的

19、用法的用法运算符new的用法该运算符的功能是用来创建堆对象,或者说,它是用来动态地创建对象。new运算符使用格式如下:new 类型说明符(初始化列表)它说明在堆中建立一个由类型说明符给定的类型的对象时,并且由括号中的初始值列表给出被创建对象的初始值.如果省去括号和括号中的初始值,则被创建的对象选用默认值.使用new运算符创建对象时,可以根据其参数来选择适当的构造函数,不需要sizeof来计算对象所占用的字节数,便可以计算其大小.new运算符返回一个指针,指针类型将与new所分配对象相匹配,如果不匹配要通过强制类型转换,否则将出现编译错误.如果new运算符不能分配到所需要的内存,它将返回0,这时

20、的指针为空指针.new运算符也可以来创建数组类型的对象,即对象数组,其格式如下:new 类名算术表达式2022/12/222022/12/22 其中其中,算术表达式算术表达式 的值为所创建的对象数组的大小的值为所创建的对象数组的大小.例如例如:A*A*ptrptr;ptrptr=new A5;=new A5;其中其中,A,A是一个已知的类名是一个已知的类名,ptrptr指向类指向类A A对象的一个指针对象的一个指针.通过通过new A5new A5创建一个对象数组创建一个对象数组,该数组有该数组有5 5个元素个元素.它的返回值赋它的返回值赋给指针给指针ptrptr,于是于是 ptrptr便指向

21、对象数组的指针便指向对象数组的指针.使用使用newnew创建对象数组或一般数组时创建对象数组或一般数组时,不能为该数组指定初不能为该数组指定初始值始值,其初始值为默认值其初始值为默认值.注意注意:(1)(1)用用newnew创建对象时创建对象时,要调用构造函数要调用构造函数.(2)(2)使用使用newnew来创建对象数组时来创建对象数组时,类中必须说明默认默认构造类中必须说明默认默认构造函数函数(3)(3)使用使用newnew创建类创建类samplesample的对象数组的对象数组SamplenSamplen 时时,系统调用系统调用默认构造函数默认构造函数n n次次.2022/12/22202

22、2/12/22运算符运算符delete的用法的用法 该运算符的功能是用来删除使用该运算符的功能是用来删除使用newnew创建的对象或一般类型的指针创建的对象或一般类型的指针.其格式其格式如下如下:delete delete 例如例如:A*A*ptrptr;ptrptr=new A(5,6);=new A(5,6);delete delete ptrptr;其中其中,ptrptr是一个指向类是一个指向类A A的指针的指针,使用使用newnew给给ptrptr分配了内存空间分配了内存空间,又使用了又使用了deletedelete删除了指针删除了指针ptrptr.运算符运算符deletedelete

23、也可以用来删除使用也可以用来删除使用newnew创建的对象数组创建的对象数组,其使用格式如下其使用格式如下:delete delete 指针名指针名 例如例如:A*A*ptrptr;ptrptr=new A5;=new A5;delete delete ptrptr;其中其中,ptrptr指向类指向类A A对象的指针对象的指针.它被赋值为指向一个具有它被赋值为指向一个具有5 5个元素的类个元素的类A A的对象的对象数组的首元素数组的首元素.使用使用deletedelete删除了这个数组删除了这个数组.2022/12/222022/12/22运算符运算符delete的用法的用法注意注意注意注意:

24、(1)(1)运算符运算符运算符运算符deletedelete必须使用于由运算符必须使用于由运算符必须使用于由运算符必须使用于由运算符newnew返回返回返回返回的指针的指针的指针的指针.(2)(2)该运算符也适用于空指针该运算符也适用于空指针该运算符也适用于空指针该运算符也适用于空指针(即其值为即其值为即其值为即其值为0 0的指针的指针的指针的指针)(3)(3)对一个指针只能使用一次对一个指针只能使用一次对一个指针只能使用一次对一个指针只能使用一次deletedelete操作操作操作操作(4)(4)指针名前只用一对括号符指针名前只用一对括号符指针名前只用一对括号符指针名前只用一对括号符,并且不

25、管所删除数并且不管所删除数并且不管所删除数并且不管所删除数组的维数组的维数组的维数组的维数,忽略方括号内的任何数字忽略方括号内的任何数字忽略方括号内的任何数字忽略方括号内的任何数字.(5)(5)用用用用deletedelete删除对象时删除对象时删除对象时删除对象时,要调用析构函数要调用析构函数要调用析构函数要调用析构函数(6)(6)使用使用使用使用deletedelete删除对象数组时删除对象数组时删除对象数组时删除对象数组时,该数组由多少元该数组由多少元该数组由多少元该数组由多少元素素素素,就调用析构函数多少次就调用析构函数多少次就调用析构函数多少次就调用析构函数多少次.2022/12/2

26、22022/12/22常类型常类型是指用类型修饰符常类型是指用类型修饰符const修饰说明修饰说明的类型的类型,常类型的变量或对象的值是不能更常类型的变量或对象的值是不能更新的新的,所以能够达到所以能够达到既保证数据共享既保证数据共享,又防止改变数据的目的又防止改变数据的目的.常对象常对象常对象是指对象常量常对象是指对象常量,定义格式如下定义格式如下:类名类名 const 对象名对象名 或者或者 const 类名类名 对象对象名名在定义常对象时必须进行初始化在定义常对象时必须进行初始化,而且该对而且该对象不能再被更新象不能再被更新.2022/12/222022/12/22常类型例如例如,有以下

27、程序有以下程序:class Sampleint 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();2022/12/222022/12/22常类型本程序中有两个错误本程序中有两个错误本程序中有两个错误本程序中有两个错误,第一个错误是第一个错误是第一个错误是第一个错误是a.setvalue(6);a.setvalue(6);语句语句语句语句,错误信息是错误信息是错误信息是错误信息是erro

28、r error C2662:setvalue:cannot convert this C2662:setvalue:cannot convert this pointer from const class pointer from const class Sample to class Sample&,Sample to class Sample&,即常对象不能被即常对象不能被即常对象不能被即常对象不能被更新更新更新更新(setvaluesetvalue成员函数修改数据成员成员函数修改数据成员成员函数修改数据成员成员函数修改数据成员).).第二个错误是第二个错误是第二个错误是第二个错误是a.d

29、isplaya.display()()语句语句语句语句,错误信息是错误信息是错误信息是错误信息是error C2662:display:cannot error C2662:display:cannot convert this pointer from const class convert this pointer from const class Sample to class Sample&,Sample to class Sample&,该错误也是由于该错误也是由于该错误也是由于该错误也是由于常对象常对象常对象常对象a a不能被更新不能被更新不能被更新不能被更新,尽管尽管尽管尽管di

30、slaydislay()()没有修改常对象没有修改常对象没有修改常对象没有修改常对象a.a.2022/12/222022/12/22常对象成员 常成员函数常成员函数常成员函数常成员函数使用使用使用使用constconst关键字说明的函数称为常成员函数,常成员函数的说明格式关键字说明的函数称为常成员函数,常成员函数的说明格式关键字说明的函数称为常成员函数,常成员函数的说明格式关键字说明的函数称为常成员函数,常成员函数的说明格式如下:如下:如下:如下:数据类型数据类型数据类型数据类型 函数名(参数表)函数名(参数表)函数名(参数表)函数名(参数表)constconst注意:注意:注意:注意:(1

31、1)constconst是函数类型的一个组成部分,因此在实现部分也要带是函数类型的一个组成部分,因此在实现部分也要带是函数类型的一个组成部分,因此在实现部分也要带是函数类型的一个组成部分,因此在实现部分也要带constconst关键字。关键字。关键字。关键字。(2 2)常成员函数不更新对象的数据成员,也不能调用该类没有用)常成员函数不更新对象的数据成员,也不能调用该类没有用)常成员函数不更新对象的数据成员,也不能调用该类没有用)常成员函数不更新对象的数据成员,也不能调用该类没有用constconst修饰的成员函数。修饰的成员函数。修饰的成员函数。修饰的成员函数。(3 3)如果将一个对象说明为常

32、对象,则通过该常对象只能调用它的常)如果将一个对象说明为常对象,则通过该常对象只能调用它的常)如果将一个对象说明为常对象,则通过该常对象只能调用它的常)如果将一个对象说明为常对象,则通过该常对象只能调用它的常成员函数,而不能调用其他成员函数。成员函数,而不能调用其他成员函数。成员函数,而不能调用其他成员函数。成员函数,而不能调用其他成员函数。(4 4)constconst可以被用于参与对重载函数的区分。例如类中有如下说明:可以被用于参与对重载函数的区分。例如类中有如下说明:可以被用于参与对重载函数的区分。例如类中有如下说明:可以被用于参与对重载函数的区分。例如类中有如下说明:Void prin

33、tVoid print()()()()Void print Void print()()()()constconst2022/12/222022/12/22示例程序 class Sampleclass Sample intint n;n;public:public:Sample(intSample(int i)ni)n=i;=i;void void print()coutprint()cout1:n=n1:n=nendlendl;void void print()constprint()const coutcout2:n=n2:n=nendlendl;void main()void main(

34、)Sample a(10);Sample a(10);const Sample b(20);const Sample b(20);a.printa.print();();b.printb.print();();2022/12/222022/12/22程序说明本程序的执行结果是本程序的执行结果是1:n=10 2:n=20本程序中本程序中Sample类中说明了两个同名函类中说明了两个同名函数数print,其中一个是常函数,在主函数中,其中一个是常函数,在主函数中说明了两个对象说明了两个对象a和和b,其中对象,其中对象b是常对是常对象,通过对象象,通过对象a调用的是没有调用的是没有const修饰的修

35、饰的函数,而通过对象函数,而通过对象b调用的是用调用的是用const修饰修饰的常函数的常函数2022/12/222022/12/22常数据成员就像一般数据一样,类中的成员数据也可就像一般数据一样,类中的成员数据也可以是常量和常引用,使用以是常量和常引用,使用const说明的数说明的数据成员为常数据成员。如果据成员为常数据成员。如果在一个类中说明了常数据成员,那么构造在一个类中说明了常数据成员,那么构造函数只能通过初始化列表对该数据成员进函数只能通过初始化列表对该数据成员进行初始化。行初始化。2022/12/222022/12/22举例 class Sampleclass Sample cons

36、t const intint n;n;public:public:Sample(intSample(int i):n(ii):n(i)void void print()coutprint()coutn=nn=nendlendl;;void main()void main()Sample a(10);Sample a(10);a.printa.print();();2022/12/222022/12/22模板模板 函数模板函数模板 C+C+提供的函数模板可以定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计提供的函数模板可以定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计的

37、通用性。的通用性。因为普通的函数只能传递变量参数,而函数模板提供了传递类型机制,使用函数模板的方法因为普通的函数只能传递变量参数,而函数模板提供了传递类型机制,使用函数模板的方法是先说明是先说明 函数模板,然后实例化成相应的模板函数进行调用执行。函数模板,然后实例化成相应的模板函数进行调用执行。函数模板说明:函数模板说明:函数模板一般的说明形式如下:函数模板一般的说明形式如下:template template 类型参数表类型参数表 返回类型返回类型 函数名(形参表)函数名(形参表)函数体;函数体;template template T Tabs(Tabs(T x)x)if(xif(x0)0)

38、return-x;return-x;return x;return x;2022/12/222022/12/22模板模板 类模板类模板类模板类模板 类模板实际上是函数模板的推广。类模板使得在说明一个类时,能够将用于这个类类模板实际上是函数模板的推广。类模板使得在说明一个类时,能够将用于这个类类模板实际上是函数模板的推广。类模板使得在说明一个类时,能够将用于这个类类模板实际上是函数模板的推广。类模板使得在说明一个类时,能够将用于这个类所需要的数据类型参数化,一个类模板是一个对象特性所需要的数据类型参数化,一个类模板是一个对象特性所需要的数据类型参数化,一个类模板是一个对象特性所需要的数据类型参数

39、化,一个类模板是一个对象特性 更一般的抽象更一般的抽象更一般的抽象更一般的抽象 类模板说明类模板说明类模板说明类模板说明 类模板的一般说明形式是:类模板的一般说明形式是:类模板的一般说明形式是:类模板的一般说明形式是:template template 类型形参表类型形参表类型形参表类型形参表 class class 类名类名类名类名 ;template template 类型形参表类型形参表类型形参表类型形参表 返回类型返回类型返回类型返回类型 类名类名类名类名 类型名表:成员函数(形参表)类型名表:成员函数(形参表)类型名表:成员函数(形参表)类型名表:成员函数(形参表)函数体函数体函数体函数体 2022/12/222022/12/22Thank You!2022/12/222022/12/222022/12/222022/12/22

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

当前位置:首页 > 生活休闲 > 生活常识

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

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