第五章特殊函数和成员优秀PPT.ppt
《第五章特殊函数和成员优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第五章特殊函数和成员优秀PPT.ppt(111页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章特殊函数和成员1第一页,本课件共有111页A A类的构造函数定义如下:类的构造函数定义如下:A:A(A:A(参数参数0)0):成员成员1(1(参数参数1)1),成员成员2(2(参数参数2)2),成员成员n(n(参数表参数表n)n)/其他操作其他操作 注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。第二页,本课件共有111页如有:如有:classdateintyear,month,day;public:;classstudentintnum;stringname;datebirthday;public:;则则stu
2、dent类的构造函数形式为:类的构造函数形式为:student(intn,strings,dated):num(n),name(s),birthday(d)第三页,本课件共有111页若对象若对象B是类是类A的子对象,则在建立的子对象,则在建立A类对象时:类对象时:执行执行B的构造函数的构造函数(初始化类中的其他成员)(初始化类中的其他成员)构造构造顺序顺序执行执行B的构造函数的构造函数(初始化(初始化B的数据成员)的数据成员)执行执行B的析构函数的析构函数执行执行A的析构函数的析构函数析构析构顺序顺序注意:注意:1)A产生对象时,先调用对象成员的构造函数,初始产生对象时,先调用对象成员的构造函
3、数,初始化对象成员,然后才执行化对象成员,然后才执行A的构造函数,对象成员的初始化的构造函数,对象成员的初始化顺序与这些对象在类顺序与这些对象在类A中的说明顺序,中的说明顺序,与它们在初始化列表中与它们在初始化列表中的顺序无关。的顺序无关。第四页,本课件共有111页注意:注意:2)A类的构造函数中未给出成员对象初始化的,成员对象产生类的构造函数中未给出成员对象初始化的,成员对象产生时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!第五页,本课件共有111页找出下面程序的错误找出下面程序的错误,改正后分析程序结果改正后分析
4、程序结果(lt5_1b.cpp)(lt5_1b.cpp)class A int x1,y1;class A int x1,y1;public:public:A(int c,int d)A(int c,int d)x1=c;y1=d;coutA x1=c;y1=d;coutA构造!构造!x1y1endl;x1y1endl;class B A a;int x2,y2;class B A a;int x2,y2;public:public:B()coutB B()coutB默认构造!默认构造!;B(int c=0,int d=0)B(int c=0,int d=0)x2=c;y2=d;coutB x
5、2=c;y2=d;coutB构造!构造!x2y2endl;x2y2endl;void main()void main()B b;B b;A()coutAA()coutA默认构造默认构造endl;endl;Bb(1,2);B(intc,intd,intx,inty):a(x,y)Bb(1,2,10,100);第六页,本课件共有111页练习:给出程序运行结果(练习:给出程序运行结果(lt5_1.cpp)#includeusingnamespacestd;classPointintx,y;public:Point():x(0),y(0)Point(inta,intb):x(a),y(b)cout构造
6、构造:x,yendl;classRectanglePointa;Pointb;public:Rectangle(intx,inty,intm,intn):a(x,y),b(m,n);voidmain()Rectanglea(1,1,5,5);b(m,n),a(x,y)第七页,本课件共有111页const成员和引用成员的初始化成员和引用成员的初始化数据成员不能在定义时初始化数据成员不能在定义时初始化数据成员操作语句必须放在成员函数中数据成员操作语句必须放在成员函数中引用成员不能初始化为常量的引用引用成员不能初始化为常量的引用const成员和引用成员成员和引用成员必须在构造函数初始化列表中初始化必
7、须在构造函数初始化列表中初始化(lt5_1c.cpp)初始化列表形式的构造函数:初始化列表形式的构造函数:A:A(参数(参数0):成员成员1(参数(参数1),成员成员2(参数(参数2)第九页,本课件共有111页usingnamespacestd;classexampleconstintnum;intdata;int&ref;public:example(intn,intf):num(n),data(f),ref(data)cout构造构造.endl;voidshow()cout对象中的数据是:对象中的数据是:num,data,refendl;voidmain()intx=1,y=2;examp
8、lea(x,y);a.show();第十页,本课件共有111页定义时使用了定义时使用了static,则成员为静态成员,则成员为静态成员5.2静态成员静态成员说明:说明:1 1)静态数据成员必须在类体外按照如下格式:)静态数据成员必须在类体外按照如下格式:类型类型 类名类名:静态成员名静态成员名=值;值;进行初始化,不可在构造函数中初始化进行初始化,不可在构造函数中初始化第十一页,本课件共有111页classTeststaticintx;intn;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(
9、Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;静态数据成员的初始化第十二页,本课件共有111页4、静态成员是类的成员不是对象的成员、静态成员是类的成员不是对象的成员2 2、staticstatic成员的所有者是成员的所有者是类类,被该类的所有对象所共有,被该类的所有对象所共有,所有对象均可访问静态成员所有对象均可访问静态成员 。静态成员仍然遵循静态成员仍然遵循public,private,protected访问准则。访问准则。3 3、静态成员不依赖于对象而存在、静态成员不依赖于对象而存在 对象不存在时静态成员已存在对象不存在时静态成员已存在5、
10、静态成员函数静态成员函数没有没有this指针指针,不可直接使用非静态成员,不可直接使用非静态成员,必须必须通过对象(或者指向对象的指针)通过对象(或者指向对象的指针)使用非静态成使用非静态成员。员。第十三页,本课件共有111页classTeststaticintx;intn;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;类中的任何函数都可以访问静态成员。静态成员函数不能直接访问非静态数据成员,可以
11、通过对象来访问。(inta)n=a;error:illegal reference to data member Test:n in a static member function.第十四页,本课件共有111页7、未定义对象时,可以通过类使用静态成员按如、未定义对象时,可以通过类使用静态成员按如下格式:下格式:类名类名:静态数据成员名静态数据成员名类名类名:静态成员函数静态成员函数();6、静态成员函数不能说明为虚函数(第、静态成员函数不能说明为虚函数(第8章)章)第十五页,本课件共有111页classTestintn;public:Test()Test(inta,intb)x=a;n=b;
12、staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;voidmain()coutTest:func();通过类使用静态成员函数staticintx;coutTest:x();通过类使用静态成员函数或者数据成员第十六页,本课件共有111页classTestintn;staticintx;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;int
13、Getn()returnn;intTest:x=25;voidmain()Testb,c;b.sfunc(b,58);coutb.Getn();coutb.func();coutc.func();Testa(24,56);couta.func()b.func()c.func()endl;582525242424第十七页,本课件共有111页classTestintn;staticintx;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()n=x+1;returnx;staticvoidsfunc(Test&ref,inta)ref.n=a;in
14、tGetn()returnn;找出下面类定义中的错误,并说明原因找出下面类定义中的错误,并说明原因intTest:x=100;静态成员函数不能直接访问非静态数据成员静态数据成员必须进行初始化第十八页,本课件共有111页1,静态成员函数与类名连用,可通过对象使用,静态成员函数与类名连用,可通过对象使用class teststatic int x;int n;public:test(int a=0,int b=0)x=a;n=b;static int func()return x;int getn()return n;int test:x=25;void main()couttest:func()
15、endl;test b;cout b.func()endl;与类名连用通过对象使用第十九页,本课件共有111页2,在没有建立对象之前,静态成员已经存在,在没有建立对象之前,静态成员已经存在class teststatic int x;int n;public:test(int a=0,int b=0)x=a;n=b;static int func()return x;int getn()return n;int test:x=25;void main()couttest:func()endl;test b,c;cout b.func()endl;第二十页,本课件共有111页3,静态成员是,静态
16、成员是类类的成员的成员不是对象的不是对象的成员成员class teststatic int x;int n;public:test(int a=0,int b=0)x=a;n=b;static int func()return x;int getn()return n;int test:x=25;void main()couttest:func()endl;test b,c;cout b.func()endl;第二十一页,本课件共有111页4,静态成员被类的所有对象共享,静态成员被类的所有对象共享class teststatic int x;int n;public:test(int a=0,
17、int b=0)x=a;n=b;static int func()return x;int getn()return n;int test:x=25;void main()couttest:func()endl;test b,c;cout b.func()c.func()endl;第二十二页,本课件共有111页5,静态成员函数不可使用非静态成员,静态成员函数不可使用非静态成员class teststatic int x;int n;public:test(int a=0,int b=0)x=a;n=b;static int func()return n;int test:x=25;void m
18、ain()couttest:func()endl;test b,c;cout b.func()c.func()endl;错误第二十三页,本课件共有111页特点:特点:一旦定义一直存在于内存中,一旦定义一直存在于内存中,直到程序结束才释放直到程序结束才释放复合语句(复合语句(用括起来的多条语句用括起来的多条语句)内定义的对象只)内定义的对象只在复合语句内有效,复合语句执行完毕,对象在复合语句内有效,复合语句执行完毕,对象释放内存。释放内存。5.2静态成员静态成员-静态对象静态对象静态对象是由静态对象是由static声明的类的对象声明的类的对象第二十四页,本课件共有111页classtestint
19、n;public:test(inti)n=i;cout构造构造:nendl;test()cout析构析构:nendl;intgetn()returnn;voidinc()+n;voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;testb(3);b.inc();coutb.n=b.getn()endl;cout循环结束循环结束endl;coutmain结束结束endl;bi=0时时:34循环开始循环开始构造构造:3b=4析构析构4i=0时时:bi=1时时:34第二十五页,本课件共有111页classtestintn;public
20、:test(inti)n=i;cout构造构造:nendl;test()cout析构析构:nendl;intgetn()returnn;voidinc()+n;voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;testb(3);b.inc();coutb.n=b.getn()endl;cout循环结束循环结束endl;coutmain结束结束endl;statictestb(3);bi=0时时:34循环开始循环开始构造构造:3b=4i=0时时:i=1时时:i=1时时:5b=5循环结束循环结束main结束结束析构析构5第二十六页
21、,本课件共有111页voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;testb(3);b.inc();coutb.n=“b.getn()endl;cout循环结束循环结束endl;coutmain结束结束endl;voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;statictestb(3);b.inc();coutb.n=“b.getn()endl;cout循环结束循环结束endl;coutmain结束结束endl;第二十七页,本课件共有111页注:静态对
22、象的构造函数与析构函数的调特点:注:静态对象的构造函数与析构函数的调特点:1、构造函数在代码执行过程中,第一次遇到它的变量定义时被调用,但、构造函数在代码执行过程中,第一次遇到它的变量定义时被调用,但直到整个程序结束之前仅调用一次。直到整个程序结束之前仅调用一次。2、析构函数在整个程序退出之前被调用,同样也只调用一次。、析构函数在整个程序退出之前被调用,同样也只调用一次。即:遇到定义则调用构造函数,程序结束调用析构函数构造函数只调用一次,析构函数也只调用一次第二十八页,本课件共有111页课程回顾2一个一个const对象只能访问对象只能访问成员函数。成员函数。3.设类设类Test中存在成员中存在
23、成员staticintx,则下列哪种初始化方式是正,则下列哪种初始化方式是正确的(确的()A.Test:intx=25;B.intx=25;C.intTest:x=25;D.intTestx=25;constC4.类类A中存在公有的静态数据成员中存在公有的静态数据成员x,设,设a和和b是类是类A的两个对象,的两个对象,在执行在执行a.x=10之后,之后,b.x的值为的值为()A.未初始化未初始化B.等于等于a.xC.等于等于0D.随机随机B1.若类的成员函数用关键字若类的成员函数用关键字static进行修饰,这样的成员函数进行修饰,这样的成员函数称为称为。静态成员函数静态成员函数第二十九页,本
24、课件共有111页5.关于类的静态成员函数描述错误的是关于类的静态成员函数描述错误的是()A.在创建对象前不存在在创建对象前不存在B.可以被非静态成员函数访问可以被非静态成员函数访问C.可以直接被静态成员函数访问可以直接被静态成员函数访问D.不是对象的成员不是对象的成员A第三十页,本课件共有111页5.3友元函数友元函数友元提供给了不同类或者对象的成员函数之间、类的成员函数与一般友元提供给了不同类或者对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。也就是说,通过友元,一个普通函数或者函数之间进行数据共享的机制。也就是说,通过友元,一个普通函数或者类的成员函数可以访问到封装于另一
25、个类中的数据,这相当于给类的封装类的成员函数可以访问到封装于另一个类中的数据,这相当于给类的封装开了一个小孔,通过它可以看到类内部的一些属性。开了一个小孔,通过它可以看到类内部的一些属性。如果友元是一般函数或者类的成员函数,则称为如果友元是一般函数或者类的成员函数,则称为友元函数友元函数。友元函数是。友元函数是拥有成员函数一切权利的非成员函数。也就是说,友元函数拥有成员函数一切权利的非成员函数。也就是说,友元函数不是类不是类的成员函数的成员函数,但可以像成员函数一样直接访问类的,但可以像成员函数一样直接访问类的私有私有成员。成员。如果友元是一个类,则称为如果友元是一个类,则称为友元类友元类,友
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 特殊 函数 成员 优秀 PPT
限制150内