C++面向对象程序设计--技能四.ppt
《C++面向对象程序设计--技能四.ppt》由会员分享,可在线阅读,更多相关《C++面向对象程序设计--技能四.ppt(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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,这时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面向 对象 程序设计 技能
限制150内