《第五章特殊函数和成员PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第五章特殊函数和成员PPT讲稿.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章特殊函数和成员1第1页,共111页,编辑于2022年,星期三A A类的构造函数定义如下:类的构造函数定义如下:A:A(A:A(参数参数0)0):成员成员1(1(参数参数1)1),成员成员2(2(参数参数2)2),成员成员n(n(参数表参数表n)n)/其他操作其他操作 注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。第2页,共111页,编辑于2022年,星期三如有:如有:classdateintyear,month,day;public:;classstudentintnum;stringname;datebirt
2、hday;public:;则则student类的构造函数形式为:类的构造函数形式为:student(intn,strings,dated):num(n),name(s),birthday(d)第3页,共111页,编辑于2022年,星期三若对象若对象B是类是类A的子对象,则在建立的子对象,则在建立A类对象时:类对象时:执行执行B的构造函数的构造函数(初始化类中的其他成员)(初始化类中的其他成员)构造构造顺序顺序执行执行B的构造函数的构造函数(初始化(初始化B的数据成员)的数据成员)执行执行B的析构函数的析构函数执行执行A的析构函数的析构函数析构析构顺序顺序注意:注意:1)A产生对象时,先调用对象
3、成员的构造函数,初始化对产生对象时,先调用对象成员的构造函数,初始化对象成员,然后才执行象成员,然后才执行A的构造函数,对象成员的初始化顺序与这些的构造函数,对象成员的初始化顺序与这些对象在类对象在类A中的说明顺序,中的说明顺序,与它们在初始化列表中的顺序无关。与它们在初始化列表中的顺序无关。第4页,共111页,编辑于2022年,星期三注意:注意:2)A类的构造函数中未给出成员对象初始化的,成员对象产生类的构造函数中未给出成员对象初始化的,成员对象产生时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!第5页,共111页,
4、编辑于2022年,星期三找出下面程序的错误找出下面程序的错误,改正后分析程序结果改正后分析程序结果(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=
5、0,int d=0)B(int c=0,int d=0)x2=c;y2=d;coutB x2=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);第6页,共111页,编辑于2022年,星期三练习:给出程序运行结果(练习:给出程序运行结果(lt5_1.cpp)#includeusingnamespacestd;classPointintx,y;pu
6、blic:Point():x(0),y(0)Point(inta,intb):x(a),y(b)cout构造构造: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)第7页,共111页,编辑于2022年,星期三const成员和引用成员的初始化成员和引用成员的初始化数据成员不能在定义时初始化数据成员不能在定义时初始化数据成员操作语句必须放在成员函数中数据成员操作语句必须放在成员函数中引用成
7、员不能初始化为常量的引用引用成员不能初始化为常量的引用const成员和引用成员成员和引用成员必须在构造函数初始化列表中初始化必须在构造函数初始化列表中初始化(lt5_1c.cpp)初始化列表形式的构造函数:初始化列表形式的构造函数:A:A(参数(参数0):成员成员1(参数(参数1),成员成员2(参数(参数2)第9页,共111页,编辑于2022年,星期三usingnamespacestd;classexampleconstintnum;intdata;int&ref;public:example(intn,intf):num(n),data(f),ref(data)cout构造构造.endl;v
8、oidshow()cout对象中的数据是:对象中的数据是:num,data,refendl;voidmain()intx=1,y=2;examplea(x,y);a.show();第10页,共111页,编辑于2022年,星期三定义时使用了定义时使用了static,则成员为静态成员,则成员为静态成员5.2静态成员静态成员说明:说明:1 1)静态数据成员必须在类体外按照如下格式:)静态数据成员必须在类体外按照如下格式:类型类型 类名类名:静态成员名静态成员名=值;值;进行初始化,不可在构造函数中初始化进行初始化,不可在构造函数中初始化第11页,共111页,编辑于2022年,星期三classTest
9、staticintx;intn;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;静态数据成员的初始化第12页,共111页,编辑于2022年,星期三4、静态成员是类的成员不是对象的成员、静态成员是类的成员不是对象的成员2 2、staticstatic成员的所有者是成员的所有者是类类,被该类的所有对象所共有,被该类的所有对象所共有,所有对象均可访问静态成员所有对象均可访问静态成员 。静态成员仍然遵循静态
10、成员仍然遵循public,private,protected访问准则。访问准则。3 3、静态成员不依赖于对象而存在、静态成员不依赖于对象而存在 对象不存在时静态成员已存在对象不存在时静态成员已存在5、静态成员函数静态成员函数没有没有this指针指针,不可直接使用非静态成员,不可直接使用非静态成员,必须必须通过对象(或者指向对象的指针)通过对象(或者指向对象的指针)使用非静态成员。使用非静态成员。第13页,共111页,编辑于2022年,星期三classTeststaticintx;intn;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()re
11、turnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;类中的任何函数都可以访问静态成员。静态成员函数不能直接访问非静态数据成员,可以通过对象来访问。(inta)n=a;error:illegal reference to data member Test:n in a static member function.第14页,共111页,编辑于2022年,星期三7、未定义对象时,可以通过类使用静态成员按如、未定义对象时,可以通过类使用静态成员按如下格式:下格式:类名类名:静态数据成员名静态数据成员名类名类名:静
12、态成员函数静态成员函数();6、静态成员函数不能说明为虚函数(第、静态成员函数不能说明为虚函数(第8章)章)第15页,共111页,编辑于2022年,星期三classTestintn;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()returnn;intTest:x=25;voidmain()coutTest:func();通过类使用静态成员函数staticintx;coutTest:x();通过类使用静态成员函数或者数据成员第16页,共11
13、1页,编辑于2022年,星期三classTestintn;staticintx;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()returnx;staticvoidsfunc(Test&r,inta)r.n=a;intGetn()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第17页,共11
14、1页,编辑于2022年,星期三classTestintn;staticintx;public:Test()Test(inta,intb)x=a;n=b;staticintfunc()n=x+1;returnx;staticvoidsfunc(Test&ref,inta)ref.n=a;intGetn()returnn;找出下面类定义中的错误,并说明原因找出下面类定义中的错误,并说明原因intTest:x=100;静态成员函数不能直接访问非静态数据成员静态数据成员必须进行初始化第18页,共111页,编辑于2022年,星期三1,静态成员函数与类名连用,可通过对象使用,静态成员函数与类名连用,可通过
15、对象使用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;cout b.func()endl;与类名连用通过对象使用第19页,共111页,编辑于2022年,星期三2,在没有建立对象之前,静态成员已经存在,在没有建立对象之前,静态成员已经存在class teststatic int x;int n;public:test(in
16、t 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;第20页,共111页,编辑于2022年,星期三3,静态成员是,静态成员是类类的成员的成员不是对象的不是对象的成员成员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()re
17、turn n;int test:x=25;void main()couttest:func()endl;test b,c;cout b.func()endl;第21页,共111页,编辑于2022年,星期三4,静态成员被类的所有对象共享,静态成员被类的所有对象共享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
18、b.func()c.func()endl;第22页,共111页,编辑于2022年,星期三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 main()couttest:func()endl;test b,c;cout b.func()c.func()endl;错误第23页,共111页,编辑于2022年,星期三特点:特点:一旦定义一直存在于内存中,一旦定义一直存在
19、于内存中,直到程序结束才释放直到程序结束才释放复合语句(复合语句(用括起来的多条语句用括起来的多条语句)内定义的对象只在)内定义的对象只在复合语句内有效,复合语句执行完毕,对象释放复合语句内有效,复合语句执行完毕,对象释放内存。内存。5.2静态成员静态成员-静态对象静态对象静态对象是由静态对象是由static声明的类的对象声明的类的对象第24页,共111页,编辑于2022年,星期三classtestintn;public:test(inti)n=i;cout构造构造:nendl;test()cout析构析构:nendl;intgetn()returnn;voidinc()+n;voidmain
20、()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时时:3 4第25页,共111页,编辑于2022年,星期三classtestintn;public:test(inti)n=i;cout构造构造:nendl;test()cout析构析构:nendl;intgetn()returnn;voidinc()+n;voidmai
21、n()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时时:3 4循环开始循环开始构造构造:3b=4i=0时时:i=1时时:i=1时时:5b=5循环结束循环结束main结束结束析构析构5第26页,共111页,编辑于2022年,星期三voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;testb(3);
22、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;第27页,共111页,编辑于2022年,星期三注:静态对象的构造函数与析构函数的调特点:注:静态对象的构造函数与析构函数的调特点:1、构造函数在代码执行过程中,第一次遇到它的变量定义时被调用,、构
23、造函数在代码执行过程中,第一次遇到它的变量定义时被调用,但直到整个程序结束之前仅调用一次。但直到整个程序结束之前仅调用一次。2、析构函数在整个程序退出之前被调用,同样也只调用一次。、析构函数在整个程序退出之前被调用,同样也只调用一次。即:遇到定义则调用构造函数,程序结束调用析构函数构造函数只调用一次,析构函数也只调用一次第28页,共111页,编辑于2022年,星期三课程回顾2一个一个const对象只能访问对象只能访问成员函数。成员函数。3.设类设类Test中存在成员中存在成员staticintx,则下列哪种初始化方式是正确,则下列哪种初始化方式是正确的(的()A.Test:intx=25;B.
24、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进行修饰,这样的成员函数称为进行修饰,这样的成员函数称为。静态成员函数静态成员函数第29页,共111页,编辑于2022年,星期三5.关于类的静态成员函数描述错误的是关于类的静态成员函数描述错误的是()A.在创建对象前不存
25、在在创建对象前不存在B.可以被非静态成员函数访问可以被非静态成员函数访问C.可以直接被静态成员函数访问可以直接被静态成员函数访问D.不是对象的成员不是对象的成员A第30页,共111页,编辑于2022年,星期三5.3友元函数友元函数友元提供给了不同类或者对象的成员函数之间、类的成员函数与一般友元提供给了不同类或者对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。也就是说,通过友元,一个普通函数或者函数之间进行数据共享的机制。也就是说,通过友元,一个普通函数或者类的成员函数可以访问到封装于另一个类中的数据,这相当于给类的封装类的成员函数可以访问到封装于另一个类中的数据,这相当于给类
26、的封装开了一个小孔,通过它可以看到类内部的一些属性。开了一个小孔,通过它可以看到类内部的一些属性。如果友元是一般函数或者类的成员函数,则称为如果友元是一般函数或者类的成员函数,则称为友元函数友元函数。友元函数是拥有。友元函数是拥有成员函数一切权利的非成员函数。也就是说,友元函数成员函数一切权利的非成员函数。也就是说,友元函数不是类的成员函数不是类的成员函数,但可以像成员函数一样直接访问类的但可以像成员函数一样直接访问类的私有私有成员。成员。如果友元是一个类,则称为如果友元是一个类,则称为友元类友元类,友元类的所有成员函数都为友元友元类的所有成员函数都为友元函数函数。第32页,共111页,编辑于
27、2022年,星期三友元的三种形式:友元的三种形式:1、普通函数作一个类的友元、普通函数作一个类的友元2、将、将a类的成员函数作类的成员函数作b类的友元类的友元3、将一个类、将一个类a作为另一个类作为另一个类b的友元的友元第33页,共111页,编辑于2022年,星期三一个友元一个友元类类/函数函数/成员函数成员函数可以可以通过对象使用另一个类的通过对象使用另一个类的私有私有成员成员。友元函数可以访问友元函数可以访问对象的私有成员,公有成员和保护成员对象的私有成员,公有成员和保护成员。友元可以是一个类或函数。友元可以是一个类或函数。友元需通过对象、对象的引用、对象的指针来使用类友元需通过对象、对象
28、的引用、对象的指针来使用类的成员。的成员。第34页,共111页,编辑于2022年,星期三在类外对在类外对fun函数进行定义,函数进行定义,此时此时fun函数不是类的成员函数函数不是类的成员函数友元声明可以在类的友元声明可以在类的private和和public部分部分普通友元函数可以通过普通友元函数可以通过对象、对象的引用、对象的指针对象、对象的引用、对象的指针使用使用对象的对象的私有成员私有成员。一、普通函数作一个类的友元一、普通函数作一个类的友元在在类体内类体内用用friend对普通函数对普通函数fun进行进行声明声明,则则fun成为类的成为类的友元函数。友元函数。第35页,共111页,编辑
29、于2022年,星期三在类体内需要对友元函数进行声明在类体内需要对友元函数进行声明classpointdoublex,y;public:point(doublexi,doubleyi)x=xi;y=yi;frienddoubledist(point&p1,point&p2);doubledist(point&p1,point&p2)doubledx=p1.x-p2.x;doubledy=p1.y-p2.y;returnsqrt(dx*dx+dy*dy);在类中声明,但不是成员函数point&p1,point&p2友元函数不是类的成员函数,没有this指针,所以必须用对象或者引用或者对象的指针做参
30、数。point:dist(point&p1,point&p2)第36页,共111页,编辑于2022年,星期三class pointdouble x,y;public:point(double m,double n)x=m;y=n;friend double dist(point&p1,point&p2);double dist(point&p1,point&p2)double dx=p1.x-p2.x;double dy=p1.y-p2.y;return sqrt(dx*dx+dy*dy);void main()point p1(1.1,2.2),p2(3.3,4.4);cout dist(p
31、1,p2)endl;第37页,共111页,编辑于2022年,星期三引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?对象做形参,形参对象对象做形参,形参对象对象做形参,形参对象对象做形参,形参对象 内存,内存,会引起会引起会引起会引起 函数调用函数调用函数调用函数调用 引用做形参,形参引用做形参,形参引用做形参,形参引用做形参,形参 内存,内存,复制构造函数复制构造函数复制构造函数复制构造函数对象做形参,形参改变对象做形参,形参改变对象做形参,形参改变对象做形参,形参改变 引起实参改变。引起实参改变。
32、引起实参改变。引起实参改变。引用做形参,形参改变引用做形参,形参改变引用做形参,形参改变引用做形参,形参改变 引起实参改变引起实参改变引起实参改变引起实参改变指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?复制构造复制构造不分配不分配不分配不分配分配分配分配分配不调用不调用不调用不调用会会会会不会不会第38页,共111页,编辑于2022年,星期三class pointdouble x,y;public:point(double m,double n)x=m;y=n;friend double dis
33、t(point&p1,point&p2);double dist(point&p1,point&p2)double dx=p1.x-p2.x;double dy=p1.y-p2.y;return sqrt(dx*dx+dy*dy);void main()point p1(1.1,2.2),p2(3.3,4.4);cout dist(p1,p2)*-&第39页,共111页,编辑于2022年,星期三假定假定f()是类是类A中的成员函数中的成员函数可以在类可以在类B中声明中声明将类将类A的成员函数的成员函数f()声明为类声明为类B的友元的友元声明函数声明函数f时需限定该函数时需限定该函数f是类是类A
34、的成员函数的成员函数并在并在f中访问中访问B的成员时,需通过对象、引用、指针来进行访问。的成员时,需通过对象、引用、指针来进行访问。二、二、A A类的成员函数作类的成员函数作B B类的友元类的友元classAvoidf(B&);;classBfriendvoidA:f(B&);;将A类的成员函数f说明为该类的友元第40页,共111页,编辑于2022年,星期三classTwo;classOneintx;public:One(inta):x(a);intGetx()returnx;voidfunc(Two&);/不完全的类声明不完全的类声明(Two),以便在类以便在类One中引用中引用Two直接使
35、用类Two的私有成员classTwointy;public:Two(intb):y(b)intGety()returny;friendvoidOne:func(Two&);voidOne:func(Two&r)r.y=x;错误:不完全声明的类不能实例化。不能存取没有完全声明的类成员。第41页,共111页,编辑于2022年,星期三#includeusingnamespacestd;classTwo;classOneintx;public:One(inta):x(a);intGetx()returnx;voidfunc(Two&);classTwointy;public:Two(intb):y(b
36、)intGety()returny;friendvoidOne:func(Two&);voidOne:func(Two&r)r.y=x;voidmain()Oneobj1(5);Twoobj2(8);coutobj1.Getx(),obj2.Gety()endl;obj1.func(obj2);cout调用友元成员函数后调用友元成员函数后:endl;coutobj1.Getx(),obj2.Gety()endl;5,8调用友元成员函数后:调用友元成员函数后:5,5第42页,共111页,编辑于2022年,星期三在类在类B中声明类中声明类A为为B的友元格式:的友元格式:classBfriendcl
37、assA二、将一个类二、将一个类A A说明为另一类说明为另一类B B的友元的友元注:如果类注:如果类A为类为类B的友元,则类的友元,则类A中的中的所有成员函数均居于友元函数所有成员函数均居于友元函数的功能的功能。第43页,共111页,编辑于2022年,星期三classTwo;classOneintx;public:One(inta):x(a);intGetx()returnx;voidfunc(Two&);classTwointy;public:Two(intb):y(b)intGety()returny;voidOne:func(Two&r)r.y=x;friendvoidOne:func(
38、Two&);friendclassOne;思考:此声明能不能省略?思考:func函数的定义可否放在类Two的定义前?不能不能不能不能voidmain()Oneobj1(5);Twoobj2(8);coutobj1.Getx(),obj2.Gety()endl;obj1.func(obj2);cout调用友元成员函数后调用友元成员函数后:endl;coutobj1.Getx(),obj2.Gety()endl;第44页,共111页,编辑于2022年,星期三总结:总结:1、友元、友元声明与访问控制无关声明与访问控制无关。在在private和和public后声明效果相同。后声明效果相同。2、友元关系
39、是、友元关系是不能传递不能传递的。的。若若A是是B的友元,的友元,B是是C的友元,的友元,A不能自动称为不能自动称为C的友元。的友元。注意:此时哪个类能访问哪个类的成员?注意:此时哪个类能访问哪个类的成员?3、友元关系是、友元关系是单向单向的。的。若若A是是B的友元,的友元,B不一定是不一定是A的友元。的友元。第45页,共111页,编辑于2022年,星期三友元的三种形式:友元的三种形式:1,普通函数作一个类的友元,普通函数作一个类的友元2,a类的成员函数作类的成员函数作b类的友元类的友元3,a类作为类作为b类的友元类的友元课程回顾课程回顾第46页,共111页,编辑于2022年,星期三1.下列关
40、于友元的描述错误的是(下列关于友元的描述错误的是()A.成员函数不可作友元成员函数不可作友元B.类可以作友元类可以作友元C.普通函数可以作友元普通函数可以作友元D.静态函数可以作友元静态函数可以作友元2.友元函数可以存取类的友元函数可以存取类的_、公有成员和保护成员。、公有成员和保护成员。3.在在C+中,虽然友元提供了类之间数据进行访问的一种方中,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的式,但它破坏了面向对象程序设计的_特性。特性。4.如果类如果类A被声明成类被声明成类B的友元,则的友元,则()A.类类A的成员即类的成员即类B的成员的成员B.类类B的成员即类的成
41、员即类A的成员的成员C.类类A的成员函数不得访问类的成员函数不得访问类B的成员的成员D.类类B不一定是类不一定是类A的友元的友元A私有成员私有成员封装封装D第47页,共111页,编辑于2022年,星期三5.对于友元描述正确的是(对于友元描述正确的是()A友元是本类的成员函数友元是本类的成员函数B友元不是本类的成员函数友元不是本类的成员函数C友元不是函数友元不是函数D友元不能访问本类私有成员友元不能访问本类私有成员B第48页,共111页,编辑于2022年,星期三6、给岀以下程序的执行结果。、给岀以下程序的执行结果。#includeclasssampleintn;public:sample(int
42、i)n=i;friendintadd(sample&s1,sample&s2);intadd(sample&s1,sample&s2)returns1.n+s2.n;voidmain()samples1(10),s2(20);coutadd(s1,s2)endl;第49页,共111页,编辑于2022年,星期三7、先找出程序中的错误,更正后分析程序的执行结果:、先找出程序中的错误,更正后分析程序的执行结果:#includeclassB;classAinti;friendB;voiddisp()coutiendl;classBpublic:voidset(intn)Aa;a.i=n;a.disp(
43、);voidmain()Bb;b.set(2);第50页,共111页,编辑于2022年,星期三作业课本课本126页,编程题第页,编程题第1题题第51页,共111页,编辑于2022年,星期三const变量定义时需要初始化变量定义时需要初始化。constintx=0;constint*p=&x;int*constp=&x;constint*constp=&x;5.4const5.4const对象对象const可限定变量、指针、对象、函数、函数的参数、数据成员、可限定变量、指针、对象、函数、函数的参数、数据成员、成员函数。表示不可改变。成员函数。表示不可改变。第52页,共111页,编辑于2022年,
44、星期三常量成员(常量成员(const成员成员)包括:包括:常量数据成员(常量数据成员(const数据成员)数据成员)常引用常引用(const限定的引用)限定的引用)静态常数据成员(静态常数据成员(staticconst数据成员)数据成员)一、常量成员一、常量成员特别注意:特别注意:1)静态常数据成员仍保留静态成员特征,需要在)静态常数据成员仍保留静态成员特征,需要在类外初始化类外初始化。2)常量数据成员和常引用成员必须在)常量数据成员和常引用成员必须在构造函数的初始化列表中进构造函数的初始化列表中进行初始化行初始化。第53页,共111页,编辑于2022年,星期三#include(lt5_7.c
45、pp)usingnamespacestd;classBaseintx;constinta;/常数据成员常数据成员staticconstintb;/静态常数据成员静态常数据成员constint&r;/常引用常引用public:Base(int,int);voidshow()coutx,a,bendl;voiddisplay(constdouble&r)coutrendl;constintBase:b=125;Base:Base(inti,intj):x(i),a(j)voidmain()Basea1(104,118),a2(119,140);a1.show();a2.show();a1.disp
46、lay(3.14159);先找出程序中的错误并改正,然后分析程序结果。常数据成员必须通过初始化列表来获得初值,r(x)常数据成员和常引用都必须通过初始化列表来获得初值,rendl;第54页,共111页,编辑于2022年,星期三#includeusingnamespacestd;classBaseintx;constinta;staticconstintb;constint&r;public:Base(int,int);voidshow()coutx,a,b,rendl;voiddisplay(constdouble&ref)coutrefendl;constintBase:b=125;Base
47、:Base(inti,intj):x(i),a(j),r(x)voidmain()Basea1(104,118),a2(119,140);doublex=3.14159;a1.show();a2.show();a1.display(x);常引用做函数参数,只是把实参的值提供给函数使用,不允许函数改变对象的值。第55页,共111页,编辑于2022年,星期三引用作形参的特点:引用作形参的特点:形参改变会使得实参改变,形参改变会使得实参改变,引用作形参,形参不分配内存引用作形参,形参不分配内存有时需要使用引用作形参但要求形参不能改变有时需要使用引用作形参但要求形参不能改变此时可使用此时可使用cons
48、t限定限定二、二、constconst引用作参数引用作参数第56页,共111页,编辑于2022年,星期三对象声明前加上对象声明前加上const限定,一般定义格式为:限定,一般定义格式为:类名类名const对象名;对象名;或者或者const类型类型对象名对象名三、常对象常对象(const对象对象)例如例如:baseconsta(25,68););constbaseb(21,32););注意:注意:1)在定义常对象时)在定义常对象时必须进行初始化必须进行初始化。2)常对象的)常对象的数据成员不能被更新数据成员不能被更新。第57页,共111页,编辑于2022年,星期三分析以下程序结果分析以下程序结果
49、(lt5_7a.cpp)#includeusingnamespacestd;classbaseintx,y;public:base():x(0),y(0)base(inta,intb):x(a),y(b)voidshow()coutx,yendl;cout+x,+yendl;voidmain()basea;a.show();baseb(10,20);b.show();第58页,共111页,编辑于2022年,星期三#includeusingnamespacestd;classbaseintx,y;public:base():x(0),y(0)base(inta,intb):x(a),y(b)vo
50、idset(inta,intb)x=a;y=b;voidshow()coutx,yendl;voidmain()basea;a.show();constbaseb(10,20);编译错误:不能改变常对象数据成员的值找出程序中的错误,并说明原因a.set(1,2);b.set(1,2);b.show();思考:如何显示b的数据成员?编译错误:常对象只能调用常成员函数。第59页,共111页,编辑于2022年,星期三四、常成员函数四、常成员函数使用使用const关键词声明的函数为常成员函数,声明格式如下:关键词声明的函数为常成员函数,声明格式如下:类型类型函数名(参数表)函数名(参数表)const;