《第五章特殊函数和成员优秀课件.ppt》由会员分享,可在线阅读,更多相关《第五章特殊函数和成员优秀课件.ppt(111页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第五章特殊函数和成员1第1页,本讲稿共111页A A类的构造函数定义如下:类的构造函数定义如下:A:A(A:A(参数参数0)0):成员成员1(1(参数参数1)1),成员成员2(2(参数参数2)2),成员成员n(n(参数表参数表n)n)/其他操作其他操作 注:如果初始化列表某项的参数表为空,则列表中相应的项可注:如果初始化列表某项的参数表为空,则列表中相应的项可以省略。以省略。第2页,本讲稿共111页如有:如有:classdateintyear,month,day;public:;classstudentintnum;stringname;datebirthday;public:;则则stude
2、nt类的构造函数形式为:类的构造函数形式为:student(intn,strings,dated):num(n),name(s),birthday(d)第3页,本讲稿共111页若对象若对象B是类是类A的子对象,则在建立的子对象,则在建立A类对象时:类对象时:执行执行B的构造函数的构造函数(初始化类中的其他成员)(初始化类中的其他成员)构造顺序执行执行B的构造函数的构造函数(初始化(初始化B的数据成员)的数据成员)执行执行B的析构函数的析构函数执行执行A的析构函数的析构函数析构顺序注意:1)A产生对象时,先调用对象成员的构造函数,初始化对象成员,然后才执行A的构造函数,对象成员的初始化顺序与这些
3、对象在类A中的说明顺序,与它们在初始化列表中的顺序无关。第4页,本讲稿共111页注意:注意:2)A类的构造函数中未给出成员对象初始化的,成员对象产生时类的构造函数中未给出成员对象初始化的,成员对象产生时调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!调用无参构造函数,若此时成员所在类中没有无参构造函数则报错!第5页,本讲稿共111页找出下面程序的错误找出下面程序的错误,改正后分析程序结果改正后分析程序结果(lt5_1b.cpp)(lt5_1b.cpp)class A int x1,y1;class A int x1,y1;public:public:A(int c,int d)A(
4、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 x2=c;y2=d;coutB构造!构造!x2y2endl;x2y2endl;void main()void main()B b;B b;A()coutAA()coutA默认构造默认构造en
5、dl;endl;Bb(1,2);B(intc,intd,intx,inty):a(x,y)Bb(1,2,10,100);第6页,本讲稿共111页练习:给出程序运行结果(练习:给出程序运行结果(lt5_1.cpp)#includeusingnamespacestd;classPointintx,y;public: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);void
6、main()Rectanglea(1,1,5,5);b(m,n),a(x,y)第7页,本讲稿共111页const成员和引用成员的初始化成员和引用成员的初始化数据成员不能在定义时初始化数据成员不能在定义时初始化数据成员操作语句必须放在成员函数中数据成员操作语句必须放在成员函数中引用成员不能初始化为常量的引用引用成员不能初始化为常量的引用const成员和引用成员成员和引用成员必须在构造函数初始化列表中初始化必须在构造函数初始化列表中初始化(lt5_1c.cpp)初始化列表形式的构造函数:初始化列表形式的构造函数:A:A(参数(参数0):成员成员1(参数(参数1),成员成员2(参数(参数2)第9页,
7、本讲稿共111页using namespace std;class exampleconst int num;int data;int&ref;public:example(int n,int f):num(n),data(f),ref(data)cout构造.endl;void show()cout对象中的数据是:num,data,refendl;void main()int x=1,y=2;example a(x,y);a.show();第10页,本讲稿共111页定义时使用了定义时使用了static,则成员为静态成员,则成员为静态成员5.2静态成员静态成员说明:说明:1 1)静态数据成员必
8、须在类体外按照如下格式:)静态数据成员必须在类体外按照如下格式:类型类型 类名类名:静态成员名静态成员名=值;值;进行初始化,不可在构造函数中初始化进行初始化,不可在构造函数中初始化第11页,本讲稿共111页class Teststatic int x;int n;public:Test()Test(int a,int b)x=a;n=b;static int func()return x;static void sfunc(Test&r,int a)r.n=a;int Getn()return n;int Test:x=25;静态数据成员的初始化第12页,本讲稿共111页4、静态成员是类的成
9、员不是对象的成员、静态成员是类的成员不是对象的成员2、static成员的所有者是类,被该类的所有对象所共有,所有对象均可访问静态成员。静态成员仍然遵循public,private,protected访问准则。3 3、静态成员不依赖于对象而存在、静态成员不依赖于对象而存在 对象不存在时静态成员已存在对象不存在时静态成员已存在5、静态成员函数静态成员函数没有没有this指针指针,不可直接使用非静态成员,不可直接使用非静态成员,必须必须通过对象(或者指向对象的指针)通过对象(或者指向对象的指针)使用非静态成员。使用非静态成员。第13页,本讲稿共111页class Teststatic int x;i
10、nt n;public:Test()Test(int a,int b)x=a;n=b;static int func()return x;static void sfunc(Test&r,int a)r.n=a;int Getn()return n;int Test:x=25;类中的任何函数都可以访问静态成员。静态成员函数不能直接访问非静态数据成员,可以通过对象来访问。(inta)n=a;error:illegal reference to data member Test:n in a static member function.第14页,本讲稿共111页7、未定义对象时,可以通过类使用静
11、态成员按如、未定义对象时,可以通过类使用静态成员按如下格式:下格式:类名类名:静态数据成员名静态数据成员名类名类名:静态成员函数静态成员函数();6、静态成员函数不能说明为虚函数(第8章)第15页,本讲稿共111页class Testint n;public:Test()Test(int a,int b)x=a;n=b;static int func()return x;static void sfunc(Test&r,int a)r.n=a;int Getn()return n;int Test:x=25;void main()coutTest:func();通过类使用静态成员函数stati
12、cintx;coutTest:x();通过类使用静态成员函数或者数据成员第16页,本讲稿共111页class Testint n;static int x;public:Test()Test(int a,int b)x=a;n=b;static int func()return x;static void sfunc(Test&r,int a)r.n=a;int Getn()return n;int Test:x=25;void main()Test b,c;b.sfunc(b,58);cout b.Getn();cout b.func();cout c.func();Test a(24,56
13、);cout a.func()b.func()c.func()endl;582525242424第17页,本讲稿共111页class Testint n;static int x;public:Test()Test(int a,int b)x=a;n=b;static int func()n=x+1;return x;static void sfunc(Test&ref,int a)ref.n=a;int Getn()return n;找出下面类定义中的错误,并说明原因找出下面类定义中的错误,并说明原因intTest:x=100;静态成员函数不能直接访问非静态数据成员静态数据成员必须进行初始化
14、第18页,本讲稿共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()endl;test b;cout b.func()endl;与类名连用通过对象使用第19页,本讲稿共111页2,在没有建立对象之前,静态成员已经存在,在没有建立对象之前,静态成员已经存在cla
15、ss 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;第20页,本讲稿共111页3,静态成员是,静态成员是类类的成员的成员不是对象的不是对象的成员成员class teststatic int x;int n;public:test(int a=0,int b=0)x=a;n=b;static i
16、nt func()return x;int getn()return n;int test:x=25;void main()couttest:func()endl;test b,c;cout b.func()endl;第21页,本讲稿共111页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(
17、)endl;test b,c;cout b.func()c.func()endl;第22页,本讲稿共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 main()couttest:func()endl;test b,c;cout b.func()c.func()endl;错误第23页,本讲稿共111页特点:特点:一旦定义一直存在于内存中,一旦定义一直存在
18、于内存中,直到程序结束才释放直到程序结束才释放复合语句(复合语句(用括起来的多条语句用括起来的多条语句)内定义的对象只在)内定义的对象只在复合语句内有效,复合语句执行完毕,对象释复合语句内有效,复合语句执行完毕,对象释放内存。放内存。5.2静态成员静态成员-静态对象静态对象静态对象是由static声明的类的对象第24页,本讲稿共111页class testint n;public:test(int i)n=i;cout构造:nendl;test()cout析构:nendl;int getn()return n;void inc()+n;void main()cout循环开始endl;for(i
19、nt i=0;i2;i+)couti=i时:endl;test b(3);b.inc();coutb.n=b.getn()endl;cout循环结束endl;coutmain结束endl;bi=0时时:3 4循环开始循环开始构造构造:3b=4析构析构4i=0时时:bi=1时时:3 4第25页,本讲稿共111页class testint n;public:test(int i)n=i;cout构造:nendl;test()cout析构:nendl;int getn()return n;void inc()+n;void main()cout循环开始endl;for(int i=0;i2;i+)c
20、outi=i时:endl;test b(3);b.inc();coutb.n=b.getn()endl;cout循环结束endl;coutmain结束endl;static test b(3);bi=0时时:3 4循环开始循环开始构造构造:3b=4i=0时时:i=1时时:i=1时时:5b=5循环结束循环结束main结束结束析构析构5第26页,本讲稿共111页voidmain()cout循环开始循环开始endl;for(inti=0;i2;i+)couti=i时时:endl;testb(3);b.inc();coutb.n=“b.getn()endl;cout循环结束循环结束endl;coutm
21、ain结束结束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页注:静态对象的构造函数与析构函数的调特点:注:静态对象的构造函数与析构函数的调特点:1、构造函数在代码执行过程中,第一次遇到它的变量定义时被调、构造函数在代码执行过程中,第一次遇到它的变量定义时被调用,但直到整个程序结束之前仅调用一次。用,但直到整个程序结束之前仅调用一次。
22、2、析构函数在整个程序退出之前被调用,同样也只调用一次。、析构函数在整个程序退出之前被调用,同样也只调用一次。即:遇到定义则调用构造函数,程序结束调用析构函数构造函数只调用一次,析构函数也只调用一次第28页,本讲稿共111页课程回顾2一个一个const对象只能访问对象只能访问成员函数。成员函数。3.设类设类Test中存在成员中存在成员staticintx,则下列哪种初始化方式,则下列哪种初始化方式是正确的(是正确的()A.Test:intx=25;B.intx=25;C.intTest:x=25;D.intTestx=25;constC4.类类A中存在公有的静态数据成员中存在公有的静态数据成员
23、x,设,设a和和b是类是类A的两个对的两个对象,在执行象,在执行a.x=10之后,之后,b.x的值为的值为()A.未初始化未初始化B.等于等于a.xC.等于等于0D.随机随机B1.若类的成员函数用关键字若类的成员函数用关键字static进行修饰,这样的成员函数进行修饰,这样的成员函数称为称为。静态成员函数静态成员函数第29页,本讲稿共111页 5.关于类的静态成员函数描述错误的是()A.在创建对象前不存在 B.可以被非静态成员函数访问 C.可以直接被静态成员函数访问 D.不是对象的成员A第30页,本讲稿共111页5.3友元函数友元函数 友元提供给了不同类或者对象的成员函数之间、类的成员函数与一
24、般函数之间进行数据共享的机制。也就是说,通过友元,一个普通函数或者类的成员函数可以访问到封装于另一个类中的数据,这相当于给类的封装开了一个小孔,通过它可以看到类内部的一些属性。如果友元是一般函数或者类的成员函数,则称为友元函数。友元函数是拥有成员函数一切权利的非成员函数。也就是说,友元函数不是类的成员函数,但可以像成员函数一样直接访问类的私有成员。如果友元是一个类,则称为友元类,友元类的所有成员函数都为友元函数。第32页,本讲稿共111页友元的三种形式:友元的三种形式:1、普通函数作一个类的友元、普通函数作一个类的友元2、将、将a类的成员函数作类的成员函数作b类的友元类的友元3、将一个类、将一
25、个类a作为另一个类作为另一个类b的友元的友元第33页,本讲稿共111页一个友元一个友元类类/函数函数/成员函数成员函数可以可以通过对象使用另一个类的通过对象使用另一个类的私有私有成员成员。友元函数可以访问友元函数可以访问对象的私有成员,公有成员和保护成员对象的私有成员,公有成员和保护成员。友元可以是一个类或函数。友元可以是一个类或函数。友元需通过对象、对象的引用、对象的指针来使友元需通过对象、对象的引用、对象的指针来使用类的成员。用类的成员。第34页,本讲稿共111页在类外对在类外对fun函数进行定义,函数进行定义,此时此时fun函数不是类的成员函数函数不是类的成员函数友元声明可以在类的友元声
26、明可以在类的private和和public部分部分普通友元函数可以通过普通友元函数可以通过对象、对象的引用、对象的指针对象、对象的引用、对象的指针使用对使用对象的象的私有成员私有成员。一、普通函数作一个类的友元一、普通函数作一个类的友元在在类体内类体内用用friend对普通函数对普通函数fun进行进行声明声明,则则fun成为类的成为类的友元函数。友元函数。第35页,本讲稿共111页在类体内需要对友元函数进行声明在类体内需要对友元函数进行声明classpointdoublex,y;public:point(doublexi,doubleyi)x=xi;y=yi;frienddoubledist(
27、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指针,所以必须用对象或者引用或者对象的指针做参数。point:dist(point&p1,point&p2)第36页,本讲稿共111页class pointdouble x,y;public:point(double m,double n)x=m;y=n;friend double
28、 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(p1,p2)endl;第37页,本讲稿共111页引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?引用做形参和对象做形参的区别是什么?对象做形参,形参对象对象做形参,形参对象对象做形参,形参对象对象做
29、形参,形参对象 内存,内存,内存,内存,会引起会引起会引起会引起 函数调用函数调用函数调用函数调用 引用做形参,形参引用做形参,形参引用做形参,形参引用做形参,形参 内存,内存,内存,内存,复制构造函数复制构造函数复制构造函数复制构造函数对象做形参,形参改变对象做形参,形参改变对象做形参,形参改变对象做形参,形参改变 引起实参改变。引起实参改变。引起实参改变。引起实参改变。引用做形参,形参改变引用做形参,形参改变引用做形参,形参改变引用做形参,形参改变 引起实参改变引起实参改变引起实参改变引起实参改变指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?指针做形参也可实现,注
30、意其形式什么?指针做形参也可实现,注意其形式什么?复制构造复制构造不分配不分配不分配不分配分配分配分配分配不调用不调用不调用不调用会会会会不会不会不会不会第38页,本讲稿共111页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
31、 p1(1.1,2.2),p2(3.3,4.4);cout dist(p1,p2)*-&第39页,本讲稿共111页假定假定f()是类是类A中的成员函数中的成员函数可以在类可以在类B中声明中声明将类将类A的成员函数的成员函数f()声明为类声明为类B的友元的友元声明函数声明函数f时需限定该函数时需限定该函数f是类是类A的成员函数的成员函数并在并在f中访问中访问B的成员时,需通过对象、引用、指针来进行访问。的成员时,需通过对象、引用、指针来进行访问。二、二、A A类的成员函数作类的成员函数作B B类的友元类的友元classAvoidf(B&);;classBfriendvoidA:f(B&);;将A
32、类的成员函数f说明为该类的友元第40页,本讲稿共111页class Two;class Oneint x;public:One(int a):x(a);int Getx()return x;void func(Two&);/不完全的类声明不完全的类声明(Two),以便在类以便在类One中引用中引用Two直接使用类Two的私有成员classTwointy;public:Two(intb):y(b)intGety()returny;friendvoidOne:func(Two&);voidOne:func(Two&r)r.y=x;错误:不完全声明的类不能实例化。不能存取没有完全声明的类成员。第41
33、页,本讲稿共111页#include using namespace std;class Two;class Oneint x;public:One(int a):x(a);int Getx()return x;void func(Two&);class Two int y;public:Two(int b):y(b)int Gety()return y;friend void One:func(Two&);void One:func(Two&r)r.y=x;voidmain()Oneobj1(5);Twoobj2(8);coutobj1.Getx(),obj2.Gety()endl;obj1
34、.func(obj2);cout调用友元成员函数后调用友元成员函数后:endl;coutobj1.Getx(),obj2.Gety()endl;5,8调用友元成员函数后:调用友元成员函数后:5,5第42页,本讲稿共111页在类在类B中声明类中声明类A为为B的友元格式:的友元格式:classBfriendclassA二、将一个类二、将一个类A A说明为另一类说明为另一类B B的友元的友元注:如果类注:如果类A为类为类B的友元,则类的友元,则类A中的中的所有成员函数均居于所有成员函数均居于友元函数的功能友元函数的功能。第43页,本讲稿共111页class Two;class Oneint x;pu
35、blic:One(int a):x(a);int Getx()return x;void func(Two&);class Twoint y;public:Two(int b):y(b)int Gety()return y;void One:func(Two&r)r.y=x;friendvoidOne:func(Two&);friendclassOne;思考:此声明能不能省略?思考:func函数的定义可否放在类Two的定义前?不能不能不能不能voidmain()Oneobj1(5);Twoobj2(8);coutobj1.Getx(),obj2.Gety()endl;obj1.func(obj
36、2);cout调用友元成员函数后调用友元成员函数后:endl;coutobj1.Getx(),obj2.Gety()endl;第44页,本讲稿共111页总结:总结:1、友元、友元声明与访问控制无关声明与访问控制无关。在在private和和public后声明效果相同。后声明效果相同。2、友元关系是、友元关系是不能传递不能传递的。的。若若A是是B的友元,的友元,B是是C的友元,的友元,A不能自动称为不能自动称为C的友元。的友元。注意:此时哪个类能访问哪个类的成员?注意:此时哪个类能访问哪个类的成员?3、友元关系是、友元关系是单向单向的。的。若若A是是B的友元,的友元,B不一定是不一定是A的友元。的
37、友元。第45页,本讲稿共111页友元的三种形式:友元的三种形式:1,普通函数作一个类的友元,普通函数作一个类的友元2,a类的成员函数作类的成员函数作b类的友元类的友元3,a类作为类作为b类的友元类的友元课程回顾课程回顾第46页,本讲稿共111页1.下列关于友元的描述错误的是(下列关于友元的描述错误的是()A.成员函数不可作友元成员函数不可作友元B.类可以作友元类可以作友元C.普通函数可以作友元普通函数可以作友元D.静态函数可以作友元静态函数可以作友元2.友元函数可以存取类的友元函数可以存取类的_、公有成员和保护成员。、公有成员和保护成员。3.在在C+中,虽然友元提供了类之间数据进行访问的一种中
38、,虽然友元提供了类之间数据进行访问的一种方式,但它破坏了面向对象程序设计的方式,但它破坏了面向对象程序设计的_特性。特性。4.如果类如果类A被声明成类被声明成类B的友元,则的友元,则()A.类类A的成员即类的成员即类B的成员的成员B.类类B的成员即类的成员即类A的成员的成员C.类类A的成员函数不得访问类的成员函数不得访问类B的成员的成员D.类类B不一定是类不一定是类A的友元的友元A私有成员私有成员封装封装D第47页,本讲稿共111页5.对于友元描述正确的是()A友元是本类的成员函数B友元不是本类的成员函数C友元不是函数D友元不能访问本类私有成员B第48页,本讲稿共111页6、给岀以下程序的执行
39、结果。#include class sampleint n;public:sample(int i)n=i;friend int add(sample&s1,sample&s2);int add(sample&s1,sample&s2)return s1.n+s2.n;void main()sample s1(10),s2(20);coutadd(s1,s2)endl;第49页,本讲稿共111页7、先找出程序中的错误,更正后分析程序的执行结果:#include class B;class Aint i;friend B;void disp()coutiendl;class Bpublic:vo
40、id set(int n)A a;a.i=n;a.disp();void main()B b;b.set(2);第50页,本讲稿共111页作业课本126页,编程题第1题第51页,本讲稿共111页const变量定义时需要初始化变量定义时需要初始化。constintx=0;constint*p=&x;int*constp=&x;constint*constp=&x;5.4const5.4const对象对象const可限定变量、指针、对象、函数、函数的参数、数据成员、成员函数。表示不可改变。第52页,本讲稿共111页常量成员(常量成员(const成员成员)包括:包括:常量数据成员(常量数据成员(co
41、nst数据成员)数据成员)常引用常引用(const限定的引用)限定的引用)静态常数据成员(静态常数据成员(staticconst数据成员)数据成员)一、常量成员特别注意:特别注意:1)静态常数据成员仍保留静态成员特征,需要在)静态常数据成员仍保留静态成员特征,需要在类外初始化类外初始化。2)常量数据成员和常引用成员必须在)常量数据成员和常引用成员必须在构造函数的初始化列表构造函数的初始化列表中进行初始化中进行初始化。第53页,本讲稿共111页#include(lt5_7.cpp)using namespace std;class Baseint x;const int a;/常数据成员stat
42、ic const int b;/静态常数据成员const int&r;/常引用public:Base(int,int);void show()coutx,a,b endl;void display(const double&r)coutrendl;const int Base:b=125;Base:Base(int i,int j):x(i),a(j)void main()Base a1(104,118),a2(119,140);a1.show();a2.show();a1.display(3.14159);先找出程序中的错误并改正,然后分析程序结果。常数据成员必须通过初始化列表来获得初值,r
43、(x)常数据成员和常引用都必须通过初始化列表来获得初值,rendl;第54页,本讲稿共111页#include using namespace std;class Baseint x;const int a;static const int b;const int&r;public:Base(int,int);void show()coutx,a,b,r endl;void display(const double&ref)coutrefendl;const int Base:b=125;Base:Base(int i,int j):x(i),a(j),r(x)void main()Base
44、a1(104,118),a2(119,140);double x=3.14159;a1.show();a2.show();a1.display(x);常引用做函数参数,只是把实参的值提供给函数使用,不允许函数改变对象的值。第55页,本讲稿共111页引用作形参的特点:引用作形参的特点:形参改变会使得实参改变,形参改变会使得实参改变,引用作形参,形参不分配内存引用作形参,形参不分配内存有时需要使用引用作形参但要求形参不能改变有时需要使用引用作形参但要求形参不能改变此时可使用此时可使用const限定限定二、二、constconst引用作参数引用作参数第56页,本讲稿共111页对象声明前加上对象声明前
45、加上const限定,一般定义格式为:限定,一般定义格式为:类名类名const对象名;对象名;或者或者const类型类型对象名对象名三、常对象常对象(const对象对象)例如例如:baseconsta(25,68););constbaseb(21,32););注意:注意:1)在定义常对象时)在定义常对象时必须进行初始化必须进行初始化。2)常对象的)常对象的数据成员不能被更新数据成员不能被更新。第57页,本讲稿共111页分析以下程序结果(lt5_7a.cpp)#include using namespace std;class baseint x,y;public:base():x(0),y(0)
46、base(int a,int b):x(a),y(b)void show()coutx,yendl;cout+x,+yendl;void main()base a;a.show();base b(10,20);b.show();第58页,本讲稿共111页#include using namespace std;class baseint x,y;public:base():x(0),y(0)base(int a,int b):x(a),y(b)void set(int a,int b)x=a;y=b;void show()coutx,yendl;void main()base a;a.show
47、();const base b(10,20);编译错误:不能改变常对象数据成员的值找出程序中的错误,并说明原因a.set(1,2);b.set(1,2);b.show();思考:如何显示b的数据成员?编译错误:常对象只能调用常成员函数。第59页,本讲稿共111页四、常成员函数四、常成员函数使用使用const关键词声明的函数为常成员函数,声明格式如下:关键词声明的函数为常成员函数,声明格式如下:类型类型函数名(参数表)函数名(参数表)const;注:注:1)const是函数说明的一个组成部分,因此在是函数说明的一个组成部分,因此在定义部分定义部分也也要带要带const关键词。关键词。2)常成员函
48、数不能更新对象的数据成员,也不能调用该类)常成员函数不能更新对象的数据成员,也不能调用该类中没有用中没有用const修饰的成员函数。修饰的成员函数。3)一个)一个const对象可以调用对象可以调用const函数,但不能调用非函数,但不能调用非const成员函数。成员函数。4)const限定的函数与未加限定的函数与未加const限定的同名函数可重载。限定的同名函数可重载。5)const不可限定析构函数和构造函数。不可限定析构函数和构造函数。第60页,本讲稿共111页#include /lt5_7c.cppusing namespace std;class baseint x,y;public:b
49、ase():x(0),y(0)base(int a,int b):x(a),y(b)void set(int a,int b)x=a;y=b;void show()coutx,yendl;cout+x,+yendl;void main()base a;a.show();const base b(10,20);/常对象 b.show();const常成员函数编译错误:常对象只能调用常成员函数!错误:在常成员函数中,不能更新对象的数据成员第61页,本讲稿共111页#include (lt5_7d.cpp)using namespace std;class baseint x,y;public:ba
50、se():x(0),y(0)base(int a,int b):x(a),y(b)void set(int a,int b)x=a;y=b;void show()const /const成员函数coutx,yendl;void show()/非const成员函数coutx,yendl;cout+x,+yendl;void main()base a;a.show();const base b(10,20);b.show();const限定的函数与未加const限定的同名函数可重载。const成员函数与同名的非const成员函数可重载。第62页,本讲稿共111页练习:找出程序中的错误并改正,然后分