收藏 分销(赏)

第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx

上传人:精*** 文档编号:5011295 上传时间:2024-10-22 格式:PPTX 页数:131 大小:929KB
下载 相关 举报
第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx_第1页
第1页 / 共131页
第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx_第2页
第2页 / 共131页
第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx_第3页
第3页 / 共131页
第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx_第4页
第4页 / 共131页
第五章特殊函数和成员公开课一等奖优质课大赛微课获奖课件.pptx_第5页
第5页 / 共131页
点击查看更多>>
资源描述

1、第五章特殊函数和组员第五章特殊函数和组员5.1对象组员初始化对象组员初始化5.2静态组员静态组员5.3友元函数友元函数5.4const对象对象5.5数组和类数组和类5.6指向类组员函数指针指向类组员函数指针5.7求一元二次方程根求一元二次方程根1 1第1页第1页第五章特殊函数和组员第五章特殊函数和组员5.1对象组员初始化对象组员初始化对象能够做类组员对象能够做类组员classA类名类名1组员组员1;类名类名2组员组员2;当当A类产生对象时要初始化类产生对象时要初始化A所有组员,因此会调用这些对象结构函数所有组员,因此会调用这些对象结构函数。类构成元素?类构成元素?数据组员数据组员和和组员组员函

2、数函数2 2第2页第2页5.1对象组员初始化对象组员初始化对象能够做类组员对象能够做类组员classA类名类名1组员组员1;类名类名2组员组员2;/A类结构函数定义下列:类结构函数定义下列:A:A(参数(参数0):组员组员1(参数(参数1),组员组员2(参数(参数2)什么是组员初始化?什么是组员初始化?定义对象时对其数据组员赋初值定义对象时对其数据组员赋初值初始化方式有几种?初始化方式有几种?1)结构函数结构函数2)初始化列表初始化列表哪种初始化方式?哪种初始化方式?2)初始化列表初始化列表3 3第3页第3页5.1对象组员初始化对象组员初始化对象能够做类组员对象能够做类组员classA类名类名

3、1组员组员1;类名类名2组员组员2;A:A(参数(参数0):组员组员1(参数(参数1),组员组员2(参数(参数2)注意:注意:A产生对象时,先调用对象组员结构函数,初产生对象时,先调用对象组员结构函数,初始化对象组员,然后才执行始化对象组员,然后才执行A结构函数结构函数;对象组员初始化顺序与这些对象在类对象组员初始化顺序与这些对象在类A中阐明顺序,中阐明顺序,与他们在初始化列表中顺序无关。与他们在初始化列表中顺序无关。4 4第4页第4页5.1对象组员初始化对象组员初始化对象能够做类组员对象能够做类组员classA类名类名1组员组员1;类名类名2组员组员2;A:A(参数(参数0):组员组员1(参

4、数(参数1),组员组员2(参数(参数2)注意:注意:A类结构函数中未给出组员对象初始化,组员类结构函数中未给出组员对象初始化,组员对象产生时调用无参结构函数对象产生时调用无参结构函数;若此时组员所在类中没有无参结构函数则报错!若此时组员所在类中没有无参结构函数则报错!5 5第5页第5页请给出下面程序执行结果请给出下面程序执行结果class A int x1,y1;class A int x1,y1;public:public:A(int c=0,int d=0)A(int c=0,int d=0)x1=c;y1=d;coutA x1=c;y1=d;coutA结构!结构!x1y1endl;x1y

5、1endl;class B A a;int x2,y2;class B A a;int x2,y2;public:public: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;6 6第6页第6页找出下面程序错误找出下面程序错误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;co

6、utA x1=c;y1=d;coutA结构!结构!x1y1endl;x1y1endl;class B A a;int x2,y2;class B A a;int x2,y2;public:public: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;在创建对象在创建对象b时,在类时,在类A中没有无参结构函中没有无参结构函数,无法对对象组员数,无法对对象组员a进行初始化进行初始化7 7第7页第7页给出程序

7、运营结果给出程序运营结果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(int c=0,int d=0):a(1,2)B(int c=0,int d=0):a(1,2)x2=c;y2=d;coutB x2=c;y2=d;coutB结构!结构!x2y2endl;x

8、2y2endl;void main()void main()B b;B b;8 8第8页第8页对象组员初始化对象组员初始化9 9第9页第9页对象组员初始化总结对象组员初始化总结对象能够做类组员对象能够做类组员/A类结构函数定义下列:类结构函数定义下列:A:A(参数(参数0):组员组员1(参数(参数1),组员组员2(参数(参数2)A产生对象时,先调用对象组员结构函数,初始化产生对象时,先调用对象组员结构函数,初始化对象组员,然后才执行对象组员,然后才执行A结构函数结构函数;对象组员初始化顺序与这些对象在类对象组员初始化顺序与这些对象在类A中阐明顺序中阐明顺序相同,与他们在初始化列表中顺序无关。相

9、同,与他们在初始化列表中顺序无关。1010第10页第10页const组员和引用组员初始化组员和引用组员初始化数据组员不能在定义时初始化数据组员不能在定义时初始化数据组员操作语句必须放在组员函数中数据组员操作语句必须放在组员函数中引用组员不能初始化为常量引用引用组员不能初始化为常量引用const组员和引用组员组员和引用组员必须在结构函数初始化列表中初始化必须在结构函数初始化列表中初始化初始化列表形式结构函数:初始化列表形式结构函数:A:A(参数(参数0):组员组员1(参数(参数1),组员组员2(参数(参数2)1111第11页第11页1212第12页第12页5.2静态组员静态组员类简朴组员函数是指

10、申明中不含类简朴组员函数是指申明中不含const、volatile、static关键字函数。关键字函数。假如类组员(数据组员或组员函数)使用关键字假如类组员(数据组员或组员函数)使用关键字static修饰,则这样组员称为修饰,则这样组员称为静态组员静态组员。静态数据组员静态数据组员或或静态组员函数静态组员函数如如staticintx;C+中关键字中关键字const、volatile、static。1313第13页第13页5.2静态组员静态组员定义时使用了定义时使用了static,则组员为静态组员,则组员为静态组员静态数据组员初始化必须在类体外按照下列格式:静态数据组员初始化必须在类体外按照下列

11、格式:类型类型类名:静态组员名类名:静态组员名=值;值;不可在结构函数中初始化不可在结构函数中初始化1414第14页第14页定义时使用了定义时使用了static,则组员为静态组员,则组员为静态组员1,静态数据组员必须在类体外按照下列格式:,静态数据组员必须在类体外按照下列格式:类型类型类名:静态组员名类名:静态组员名=值;值;进行初始化,不可在结构函数中初始化进行初始化,不可在结构函数中初始化2,static组员所有者是类,组员所有者是类,而不是对象;而不是对象;3,静态组员被该类所有对象所共有,静态组员被该类所有对象所共有,所有对象均可访问静态组员所有对象均可访问静态组员4,静态组员不依赖于

12、对象而存在,静态组员不依赖于对象而存在对象不存在时静态组员已存在对象不存在时静态组员已存在1515第15页第15页定义时使用了定义时使用了static,则组员为静态组员,则组员为静态组员5,静态组员函数不可直接使用非静态组员,静态组员函数不可直接使用非静态组员,但可通过对象使用非静态组员但可通过对象使用非静态组员6,静态组员仍然遵循,静态组员仍然遵循public,private,protected访问准则。访问准则。1616第16页第16页定义时使用了定义时使用了static,则组员为静态组员,则组员为静态组员7.静态组员函数没有静态组员函数没有this指针,指针,它不能使用类中定义非静态组员

13、它不能使用类中定义非静态组员 8,静态组员函数不能阐明为虚函数,静态组员函数不能阐明为虚函数9,未定义对象时,能够通过类使用静态组员按下列格式:,未定义对象时,能够通过类使用静态组员按下列格式:类名:静态数据组员名类名:静态数据组员名类名:静态组员函数类名:静态组员函数();1717第17页第17页1818第18页第18页找出程序中错误找出程序中错误在静态函数在静态函数中访问了非中访问了非静态数据组静态数据组员员静态数据组静态数据组员初始化无员初始化无类型阐明类型阐明1919第19页第19页找出程序中错误找出程序中错误静态数据组员静态数据组员初始化无类型初始化无类型及所属类限定及所属类限定阐明

14、阐明2020第20页第20页1,静态组员函数与类名连用,可通过对象使用,静态组员函数与类名连用,可通过对象使用classteststaticintx;intn;public:test(inta=0,intb=0)x=a;n=b;staticintfunc()returnx;intgetn()returnn;inttest:x=25;voidmain()couttest:func()endl;testb,c;coutb.func()endl;2121第21页第21页2,在没有建立对象之前,静态组员已经存在,在没有建立对象之前,静态组员已经存在classteststaticintx;intn;pu

15、blic:test(inta=0,intb=0)x=a;n=b;staticintfunc()returnx;intgetn()returnn;inttest:x=25;voidmain()couttest:func()endl;testb,c;coutb.func()endl;对静态数对静态数据组员初据组员初始化始化对静态组对静态组员函数访员函数访问问2222第22页第22页3,静态组员是类组员不是对象组员,静态组员是类组员不是对象组员classteststaticintx;intn;public:test(inta=0,intb=0)x=a;n=b;staticintfunc()retur

16、nx;intgetn()returnn;inttest:x=25;voidmain()couttest:func()endl;testb,c;coutb.func()endl;2323第23页第23页4,静态组员被类所有对象共享,静态组员被类所有对象共享classteststaticintx;intn;public:test(inta=0,intb=0)x=a;n=b;staticintfunc()returnx;intgetn()returnn;inttest:x=25;voidmain()couttest:func()endl;testb,c;coutb.func()c.func()end

17、l;2424第24页第24页 b.s c.s d.s示例:示例:示例:示例:a.sstatic int s;static int s;5.4 静态组员第25页第25页5,静态组员函数不可使用非静态组员(包括组员函数和数据组员),静态组员函数不可使用非静态组员(包括组员函数和数据组员)classteststaticintx;intn;public:test(inta=0,intb=0)x=a;n=b;staticintfunc()f();returnx;intf();inttest:x=25;错:在静态错:在静态函数中调用函数中调用了非静态函了非静态函数!数!2626第26页第26页5,静态组员

18、函数不可使用非静态组员(包括组员函数和数据组员),静态组员函数不可使用非静态组员(包括组员函数和数据组员)classteststaticintx;intn;public:test(inta=0,intb=0)x=a;n=b;staticintfunc()n=5;returnx;intf();inttest:x=25;错:在静态错:在静态函数中使用函数中使用了非静态数了非静态数据组员!据组员!2727第27页第27页5,静态组员函数不可使用非静态组员(包括组员函数和数据组员),静态组员函数不可使用非静态组员(包括组员函数和数据组员)classteststaticintx;intn;public:

19、test(inta=0,intb=0)x=a;n=b;staticintfunc()returnx;intf()x=5;func();/能够使用能够使用x与与func函数函数;inttest:x=25;普通函数能普通函数能够使用静态够使用静态数据组员或数据组员或静态函数!静态函数!2828第28页第28页/例例5-13 静态数据组员阐明和初始化静态数据组员阐明和初始化#includeclass counter static int num;public:void setnum(int i)num=i;void shownum()cout num t;int counter:num=0;void

20、 main()counter a,b;a.shownum();b.shownum();a.setnum(10);a.shownum();b.shownum();第29页第29页/例例5-13 静态数据组员阐明和初始化静态数据组员阐明和初始化#includeclass counter static int num;public:void setnum(int i)num=i;void shownum()cout num t;int counter:num=0;void main()counter a,b;a.shownum();b.shownum();a.setnum(10);a.shownum

21、();b.shownum();申明与定义申明与定义静态数据组员静态数据组员第30页第30页/例例5-13 静态数据组员阐明和初始化静态数据组员阐明和初始化#includeclass counter static int num;public:void setnum(int i)num=i;void shownum()cout num t;int counter:num=0;void main()counter a,b;a.shownum();b.shownum();a.setnum(10);a.shownum();b.shownum();组员函数访问组员函数访问 静态数据组员静态数据组员第31

22、页第31页/例例5-13 静态数据组员阐明和初始化静态数据组员阐明和初始化#includeclass counter static int num;public:void setnum(int i)num=i;void shownum()cout num t;int counter:num=0;void main()counter a,b;a.shownum();b.shownum();a.setnum(10);a.shownum();b.shownum();调用组员函数访问调用组员函数访问 私有静态数据组员私有静态数据组员第32页第32页/例例5-13 静态数据组员阐明和初始化静态数据组员阐

23、明和初始化#includeclass counter static int num;public:void setnum(int i)num=i;void shownum()cout num t;int counter:num=0;void main()counter a,b;a.shownum();b.shownum();a.setnum(10);a.shownum();b.shownum();访问同一个访问同一个 静态数据组员静态数据组员第33页第33页5.2静态组员静态组员-静态对象静态对象静态对象是由静态对象是由static定义对象定义对象特点:特点:一旦定义始终存在于内存中,一旦定义

24、始终存在于内存中,直到程序结束才释放直到程序结束才释放复合语句内定义变量只在复合语句内有效,符合语句执行完毕,变量释放内存。复合语句内定义变量只在复合语句内有效,符合语句执行完毕,变量释放内存。3434第34页第34页5.2静态组员静态组员-静态对象静态对象3535第35页第35页5.2静态组员静态组员-静态对象静态对象对于静态对象对于静态对象1,碰到定义则调用结构函数,碰到定义则调用结构函数,程序结束调用析构函数程序结束调用析构函数2,结构函数只调用一次,结构函数只调用一次,析构函数也只调用一次析构函数也只调用一次3636第36页第36页5.3友元函数友元函数采用类机制后实现了数据隐藏与封装

25、,类数据组员普采用类机制后实现了数据隐藏与封装,类数据组员普通定义为私有组员,组员函数普通定义为公有,依此提通定义为私有组员,组员函数普通定义为公有,依此提供类与外界间通信接口。供类与外界间通信接口。有时一些函数不是类一部分,但又需要频繁地访问有时一些函数不是类一部分,但又需要频繁地访问类数据组员,这时能够将这些函数定义为该函数友元函类数据组员,这时能够将这些函数定义为该函数友元函数。数。除了友元函数外,尚有友元类,两者统称为友元。除了友元函数外,尚有友元类,两者统称为友元。友元不是类组员函数,但能够访问类私有组员,破坏友元不是类组员函数,但能够访问类私有组员,破坏了类封装性和隐藏性;提升了程

26、序运营效率(即减少了了类封装性和隐藏性;提升了程序运营效率(即减少了类型检查和安全性检查等都需要时间开销)。类型检查和安全性检查等都需要时间开销)。3737第37页第37页5.3友元函数友元函数友元函数是定义在类外普通函数,它不属于任何类,友元函数是定义在类外普通函数,它不属于任何类,能够直接访问类私有组员;需要在类定义中加以申明,能够直接访问类私有组员;需要在类定义中加以申明,申明格式下列:申明格式下列:friend类型类型函数名函数名(形式参数形式参数);友元函数申明能够放在类私有部分,也能够放在公有友元函数申明能够放在类私有部分,也能够放在公有部分,它们是没有区别。部分,它们是没有区别。

27、一个函数能够是多个类友元函数,只需要在各个类中一个函数能够是多个类友元函数,只需要在各个类中分别申明。分别申明。友元函数调用与普通函数调用方式和原理一致。友元函数调用与普通函数调用方式和原理一致。3838第38页第38页5.3友元函数友元函数一个友元一个友元类类/函数函数/组员函数组员函数能够能够通过对象使用另一个类私有组员通过对象使用另一个类私有组员。友元函数能够访问友元函数能够访问对象私有组员,公有组员和保护组员对象私有组员,公有组员和保护组员。友元能够是一个类或函数。友元能够是一个类或函数。友元需通过对象、对象引用、对象指针来使用类组员。友元需通过对象、对象引用、对象指针来使用类组员。3

28、939第39页第39页5.3友元函数友元函数友元三种形式:友元三种形式:1.普通函数作一个类友元普通函数作一个类友元2.a类组员函数作类组员函数作b类友元类友元3.a类作为类作为b类友元类友元4040第40页第40页1,普通函数作一个类友元,普通函数作一个类友元在类体内用在类体内用friend对普通函数对普通函数f进行申明,进行申明,则则f成为类友元函数成为类友元函数在类外对在类外对f函数进行定义,函数进行定义,f函数不是类组员函数函数不是类组员函数友元申明能够在类友元申明能够在类private和和public部分部分为何说友元破坏了类封装性?为何说友元破坏了类封装性?普通友元函数能够通过对象

29、、对象引用、对象指普通友元函数能够通过对象、对象引用、对象指针使用对象私有组员。针使用对象私有组员。4141第41页第41页1,普通函数作一个类友元,普通函数作一个类友元在类体内需要对友元函数进行申明在类体内需要对友元函数进行申明classpointdoublex,y;public:point(doublexi,doubleyi)x=xi;y=yi;friend double dist(point&p1,point&p2);friend double dist(point&p1,point&p2);doubledist(point&p1,point&p2)doubledx=p1.x-p2.x;

30、doubledy=p1.y-p2.y;returnsqrt(dx*dx+dy*dy);4242第42页第42页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);voidmain()pointp1(1.1,2.2),p2(3.3,4.4);coutdist(p1,p2)end

31、l;4343第43页第43页classpointdoublex,y;public:point(doublexi,doubleyi)x=xi;y=yi;friend double dist(point p1,point p2);friend double dist(point p1,point p2);doubledist(pointp1,pointp2)doubledx=p1.x-p2.x;doubledy=p1.y-p2.y;returnsqrt(dx*dx+dy*dy);voidmain()pointp1(1.1,2.2),p2(3.3,4.4);coutdist(p1,p2)endl;4

32、444第44页第44页引用做形参和对象做形参区别是什么?引用做形参和对象做形参区别是什么?引用做形参和对象做形参区别是什么?引用做形参和对象做形参区别是什么?对象做形参,形参对象分派内存,对象做形参,形参对象分派内存,对象做形参,形参对象分派内存,对象做形参,形参对象分派内存,会引起复制结构函数调用会引起复制结构函数调用会引起复制结构函数调用会引起复制结构函数调用 引用做形参,形参不分派内存,引用做形参,形参不分派内存,引用做形参,形参不分派内存,引用做形参,形参不分派内存,不调用复制结构函数不调用复制结构函数不调用复制结构函数不调用复制结构函数引用做形参,引用做形参,引用做形参,引用做形参,

33、形参改变会引起实参改变形参改变会引起实参改变形参改变会引起实参改变形参改变会引起实参改变指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?指针做形参也可实现,注意其形式什么?4545第45页第45页友元函数使用(定义变形友元函数使用(定义变形友元函数使用(定义变形友元函数使用(定义变形-对象引用做形参)对象引用做形参)对象引用做形参)对象引用做形参)引用形引用形参参函数调用实参是什么?函数调用实参是什么?引用形参引用形参实参对象实参对象4646第46页第46页友元函数使用(定义变形友元函数使用(定义变形友元函数使用(定义变形友元函数使用

34、(定义变形-对象指针做形参)对象指针做形参)对象指针做形参)对象指针做形参)指针形指针形参参函数调用实参是什么?函数调用实参是什么?指针形参指针形参实参地址实参地址4747第47页第47页2,A类组员函数作类组员函数作B类友元类友元假定类假定类A中有组员函数中有组员函数f(),能够在类能够在类B中申明中申明类类A组员函数组员函数f()为类为类B友元友元申明函数申明函数f时需限定该函数时需限定该函数f是类是类A组员函数组员函数在在f中访问中访问B组员时,需通过对象、引用、指针来进行访问。组员时,需通过对象、引用、指针来进行访问。4848第48页第48页4949第49页第49页这样定义有错这样定义

35、有错程序无法执行,!程序无法执行,!classTwo不完全申明时不能不完全申明时不能定义对象和引用定义对象和引用5050第50页第50页这样定义有错这样定义有错程序无法执行,!程序无法执行,!classTwo不完全申明时不能定义对象和引用不完全申明时不能定义对象和引用5151第51页第51页5252第52页第52页请写出程序运营结果!请写出程序运营结果!5353第53页第53页3,A类作类作B类友元类友元在类在类B中申明类中申明类A为为B友元格式:友元格式:classB。friendclassA。如此申明之后,如此申明之后,B组员函数,可访问类组员函数,可访问类A私有组员私有组员。能够通过能够

36、通过能够通过能够通过AA类对象直接访问类类对象直接访问类类对象直接访问类类对象直接访问类AA私有组员,私有组员,私有组员,私有组员,5454第54页第54页3,A类作类作B类友元类友元classTwoprivate:inty;public:friendclassOne;classOneprivate:intx;public:One(inta,Two&r,intb)x=a;r.y=b;voidDisplay(Two&t);voidOne:Display(Two&r)coutxr.yendl;5555第55页第55页3,A类作类作B类友元类友元voidmain()Twoobj2;Oneobj1(2

37、3,Obj2,55);obj1.Display(Obj2);5656第56页第56页问题:问题:classTwoclassTwo申明能不能申明能不能省略?省略?funfun函数定义可否放函数定义可否放在在classTwoclassTwo定义前定义前5757第57页第57页5858第58页第58页总结:总结:友元申明与访问控制无关,友元申明与访问控制无关,在在private和和public后申明效果相同。后申明效果相同。注意:注意:友元关系是单向,不能传递友元关系是单向,不能传递若若A是是B友元,友元,B是是C友元,友元,A不能自动称为不能自动称为C友元。友元。友元关系不含有互换性友元关系不含有

38、互换性若若A是是B友元,则友元,则B不一定是不一定是A友元友元5959第59页第59页总结:友元函数总结:友元函数友元三种形式:友元三种形式:1,普通函数作一个类友元,普通函数作一个类友元2,a类组员函数作类组员函数作b类友元类友元3,a类作为类作为b类友元类友元6060第60页第60页5.4const对象对象const可限定变量、指针、对象、函数、函数参数、数据组员、组员函数。表示不可可限定变量、指针、对象、函数、函数参数、数据组员、组员函数。表示不可改变。改变。const变量定义时需要初始化。变量定义时需要初始化。constintx;constintx=0;constint*p;int*c

39、onstp;constint*constp;6161第61页第61页5.4const对象对象1,常量组员,常量组员const组员组员包括:包括:常量数据组员(常量数据组员(const数据组员)数据组员)常引用常引用(const限定引用)限定引用)静态常数据组员(静态常数据组员(staticconst数据组员)数据组员)尤其注意:尤其注意:常量数据组员和常引用组员常量数据组员和常引用组员必须在结构函数初始化列表中进行初始化必须在结构函数初始化列表中进行初始化。6262第62页第62页5.4const对象对象1,常量组员,常量组员const组员组员包括:包括:常量数据组员(常量数据组员(const

40、数据组员)数据组员)常引用常引用(const限定引用)限定引用)静态常数据组员(静态常数据组员(staticconst数据组员)数据组员)尤其注意:尤其注意:静态常数据组员保留静态组员特点,静态常数据组员保留静态组员特点,需要在类外按静态组员初始化方式进行初始化需要在类外按静态组员初始化方式进行初始化6363第63页第63页例题:例题:5.76464第64页第64页5.4const对象对象1.常量组员常量组员const组员组员2.const引用作函数参数引用作函数参数6565第65页第65页5.4const对象对象1,常量组员,常量组员const组员组员包括:包括:常量数据组员(常量数据组员(

41、const数据组员)数据组员)常引用常引用(const限定引用)限定引用)静态常数据组员(静态常数据组员(staticconst数据组员)数据组员)请注意三种请注意三种const组员初始化方式!组员初始化方式!6666第66页第66页2,const引用作函数参数引用作函数参数引用作形参特点:引用作形参特点:引用作形参,形参不分派内存引用作形参,形参不分派内存形参改变会使得实参改变,形参改变会使得实参改变,有时需要使用引用作形参,但要求形参不能改变有时需要使用引用作形参,但要求形参不能改变此时可使用此时可使用const限定限定6767第67页第67页classtestclasstestpriva

42、te:intx;private:intx;public:test(inta=0)x=a;public:test(inta=0)x=a;voidsetx(constint&y)voidsetx(constint&y)x=y;y+;x=y;y+;voidget()voidget()coutxendl;coutxendl;voidmain()intx=5;testa;a.setx(x);a.get();找出程序中错误找出程序中错误找出程序中错误找出程序中错误改变了常引用改变了常引用形式参数值形式参数值6868第68页第68页3,常对象常对象(const对象对象)对象申明前加上对象申明前加上const

43、限定,则对象不可改变,即限定,则对象不可改变,即对象数据组员值不可改变对象数据组员值不可改变。常对象在申明时必须同时进行初始化。常对象在申明时必须同时进行初始化。申明格式:申明格式:类名类名const对象名(参数表);对象名(参数表);或或const类名类名对象名(参数表);对象名(参数表);如:如:baseconsta(25,68););如此定义如此定义a对象内容不可变!对象内容不可变!6969第69页第69页basecosnta(25,68););constbaseb(21,32););如此定义如此定义a,b对象内容不可变!对象内容不可变!const对象只能调用对象只能调用const组员函

44、数组员函数const函数中不允许使用改变变量或组员值语句函数中不允许使用改变变量或组员值语句7070第70页第70页7171第71页第71页找出程序中错误找出程序中错误常对象调用了常对象调用了普通组员函数普通组员函数7272第72页第72页4,const函数函数定义函数时在函数阐明后加定义函数时在函数阐明后加const限定,则函数为限定,则函数为const函数函数const函数中不允许使用改变变量或组员值语句函数中不允许使用改变变量或组员值语句const限定函数与未加限定函数与未加const限定同名函数可重载。限定同名函数可重载。const对象能够调用对象能够调用const函数,但不能调用普通

45、函数;函数,但不能调用普通函数;普通对象能够调用普通对象能够调用const函数。函数。7373第73页第73页4,const函数函数定义函数时在函数首部后加定义函数时在函数首部后加const限定,则函数为限定,则函数为const函数函数const不可限定析构函数和结构函数。不可限定析构函数和结构函数。7474第74页第74页请给出程序运营结果请给出程序运营结果7575第75页第75页总结:总结:1,const数据组员数据组员必须在结构函数初始化列表必须在结构函数初始化列表中进行初始化。中进行初始化。2,const限定组员函数内限定组员函数内不可出现任何改变变量值语句不可出现任何改变变量值语句。

46、3,const限定对象不能调用任何限定对象不能调用任何非非const组员函数组员函数4,const限定引用做参数时,限定引用做参数时,函数体内不可出现改变参数值语句。函数体内不可出现改变参数值语句。问题:非问题:非const对象可否使用对象可否使用const函数?函数?7676第76页第76页classPointclassPointprivate:intx,y;private:intx,y;public:public:Point(inta=0,intb=0)Point(inta=0,intb=0)x=a;y=b;x=a;y=b;voidset(inta,intb)voidset(inta,in

47、tb)x=a;y=b;x=a;y=b;voidget()voidget()coutxyendl;coutxyshow();7979第79页第79页请给出程序运营结果请给出程序运营结果8080第80页第80页请给出程序运营结果请给出程序运营结果8181第81页第81页5.5数组和类数组和类定义对象指针数组定义对象指针数组int*p;表示定义一个指针变量表示定义一个指针变量intp5;表示定义一个数组。表示定义一个数组。int*p5表示定义一个数组中有表示定义一个数组中有5个元素,每个元素是一个指针。个元素,每个元素是一个指针。这类数组称为这类数组称为指针数组指针数组。point*p;p=newp

48、oint;p=newpoint(1,2);8282第82页第82页5.5数组和类数组和类定义对象指针数组定义对象指针数组point*p3;p0=newpoint(1,2);p1=newpoint(3,4);p2=newpoint(5,6);通过通过p0使用使用p0指向对象。指向对象。p0-show();可通过循环使用可通过循环使用pi指向对象。指向对象。8383第83页第83页5.5数组和类数组和类定义指向对象指针数组,并初始化。定义指向对象指针数组,并初始化。point*p3=newpoint(1,2),newpoint(3,4),newpoint(5,6);8484第84页第84页test

49、类仍然使用刚刚定义,请更正类仍然使用刚刚定义,请更正main中错误中错误错误:错误:Twoi是指针,是指针,而不是对象,不能而不是对象,不能用用.操作符操作符8585第85页第85页test类仍然使用刚刚定义,请更正类仍然使用刚刚定义,请更正main中错误中错误8686第86页第86页5.6指向组员函数指针指向组员函数指针函数被调用时需要调入内存函数被调用时需要调入内存函数有地址:函数有地址:存储函数内存单元首地址存储函数内存单元首地址指针能够存储地址指针能够存储地址存储函数地址指针称为存储函数地址指针称为指向函数指针指向函数指针定义形式:定义形式:类型类型(*指针名指针名)(参数类型参数类型

50、);函数指针指向函数语句:函数指针指向函数语句:指针名指针名=函数名;函数名;8787第87页第87页5.6指向组员函数指针指向组员函数指针intmax(inta,intb)returnab?a:b;voidmain()int(*p)(int,int);p=max;(*p)(1,2);8888第88页第88页int A:max(int a,int b)int A:max(int a,int b)return ab?a:b;return ab?a:b;定义一个指向类定义一个指向类A组员函数指针组员函数指针定义形式:类型定义形式:类型(类名类名:*指针名指针名)(参数类型参数类型);int(A:*

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服