第11章类和对象课件.ppt

上传人(卖家):晟晟文业 文档编号:3860597 上传时间:2022-10-19 格式:PPT 页数:94 大小:236.19KB
下载 相关 举报
第11章类和对象课件.ppt_第1页
第1页 / 共94页
第11章类和对象课件.ppt_第2页
第2页 / 共94页
第11章类和对象课件.ppt_第3页
第3页 / 共94页
第11章类和对象课件.ppt_第4页
第4页 / 共94页
第11章类和对象课件.ppt_第5页
第5页 / 共94页
点击查看更多>>
资源描述

1、第第1111章章 类和对象类和对象11.1 11.1 面向对象的思想面向对象的思想11.2 11.2 面向对象程序设计的基本特点面向对象程序设计的基本特点11.3 11.3 面向对象软件开发的基本过程面向对象软件开发的基本过程11.4 11.4 类和对象类和对象11.5 11.5 构造函数与析构函数构造函数与析构函数11.6 11.6 友元友元11.7 11.7 静态成员静态成员11.8 const11.8 const对象和成员函数对象和成员函数11.9 11.9 应用实例应用实例作业:作业:1010,1313,1414,151511.1 11.1 面向对象的思想面向对象的思想 什么是面向过程

2、?什么是面向对象?什么是面向过程?什么是面向对象?两种不同的思想、方法。两种不同的思想、方法。面向过程的程序设计面向过程的程序设计 用传统程序设计语言进行程序设计时,必须详细地用传统程序设计语言进行程序设计时,必须详细地描述解题的过程。描述解题的过程。程序设计工作主要围绕设计解题程序设计工作主要围绕设计解题过程来进行过程来进行,这种传统的程序设计方法称为面向过,这种传统的程序设计方法称为面向过程的程序设计。程的程序设计。面向过程程序设计面向过程程序设计 特点特点 程序程序处理数据的一系列过程;处理数据的一系列过程;数据与过程分离;数据与过程分离;程序数据结构算法程序数据结构算法 缺点缺点重用性

3、差重用性差维护困难维护困难 面向对象程序设计面向对象程序设计 面向对象程序设计:将面向对象面向对象程序设计:将面向对象方法用于程序设计。方法用于程序设计。出发点与基本原则:出发点与基本原则:模拟人类习惯思维方式,使开发软件的方法尽可能接近人模拟人类习惯思维方式,使开发软件的方法尽可能接近人类认识世界解决问题的方法。类认识世界解决问题的方法。对象作为模块对象作为模块,对象是对客观事物的自然的、直接的对象是对客观事物的自然的、直接的抽象和模拟,包含了数据及对数据的操作。抽象和模拟,包含了数据及对数据的操作。11.2 11.2 面向对象程序设计的基本特点面向对象程序设计的基本特点 封装性封装性将描述

4、对象的数据及处理这些数据的代码集中起将描述对象的数据及处理这些数据的代码集中起来放在对象内部,对象成为独立模块。来放在对象内部,对象成为独立模块。继承性继承性 从已有类从已有类(称为基类称为基类)派生出新类。派生出新类。多态性多态性同一个名字代表不同、但相似的功能。同一个名字代表不同、但相似的功能。11.3 11.3 面向对象软件开发的基本过程面向对象软件开发的基本过程 软件危机促进了软件工程的形成与发展。软件危机促进了软件工程的形成与发展。软件工程:用系统工程学的原理和方法管理软件开发软件工程:用系统工程学的原理和方法管理软件开发过程,开发过程分为分析、设计、编程、测试、维护过程,开发过程分

5、为分析、设计、编程、测试、维护等阶段。等阶段。面向对象的软件工程面向对象的软件工程分析:明确系统必须做什么。分析:明确系统必须做什么。设计:明确软件系统怎么做。设计:明确软件系统怎么做。实现:选用合适的面向对象编程语言,实现设计阶段描述实现:选用合适的面向对象编程语言,实现设计阶段描述的软件系统的各个类模块,并根据类的相互关系集成。的软件系统的各个类模块,并根据类的相互关系集成。测试:发现软件中的错误。测试:发现软件中的错误。维护:在软件交付用户使用期间,对软件所作的修改。维护:在软件交付用户使用期间,对软件所作的修改。11.4 11.4 类和对象类和对象 在面向对象程序设计中,对象是构成程序

6、的模块,即在面向对象程序设计中,对象是构成程序的模块,即程序是由一组对象构成的,对象之间通过消息分工协程序是由一组对象构成的,对象之间通过消息分工协作,共同完成程序的功能。作,共同完成程序的功能。类是面向对象程序设计的核心,是对具有相同属性与类是面向对象程序设计的核心,是对具有相同属性与行为的一组事物的抽象描述。利用类可以把数据和对行为的一组事物的抽象描述。利用类可以把数据和对数据所做的操作组合成一个整体,实现对数据的封装数据所做的操作组合成一个整体,实现对数据的封装和隐藏。和隐藏。类是用户自定义的数据类型,是创建对象的模型。类是用户自定义的数据类型,是创建对象的模型。11.4.1 11.4.

7、1 类的定义类的定义 1格式格式关键字关键字class 类名类名 成员成员1说明;说明;成员成员2说明;说明;成员成员n说明;说明;;类定义体类定义体分号不可缺!分号不可缺!2类的组成成员类的组成成员 数据成员数据成员:变量或对象。变量或对象。基本类型:基本类型:intint、floatfloat、doubledouble、charchar、boolbool复合类型:数组、指针、引用、结构、枚举等复合类型:数组、指针、引用、结构、枚举等成员函数成员函数 对数据成员进行操作。对数据成员进行操作。class Circle private:int radius;public:void setRadi

8、us(int r)radius=r;double area()return 3.14*radius*radius;数据成员数据成员函数成员函数成员1?函数成员函数成员2 在定义一个类时,注意:在定义一个类时,注意:类只是一种自定义数据类型,类中任何成员数据类只是一种自定义数据类型,类中任何成员数据均不能使用关键字均不能使用关键字externextern、autoauto或或registerregister指定其指定其存储类型,也不能初始化。例如:存储类型,也不能初始化。例如:class Circle class Circle int radius=5;/int radius=5;/错误错误 e

9、xtern float pi;/extern float pi;/错误错误 /省略其它成员省略其它成员 ;成员函数可直接使用类中的任一成员。成员函数可直接使用类中的任一成员。类类型与结构体类型相似,结构体类型也可有函类类型与结构体类型相似,结构体类型也可有函数成员,差别在于,类类型的缺省访问权限是数成员,差别在于,类类型的缺省访问权限是privateprivate,结构体类型的缺省访问权限是,结构体类型的缺省访问权限是publicpublic。11.4.2 11.4.2 类成员的访问控制类成员的访问控制 访问权限控制访问权限控制访问权限访问权限private只允许同类的成员函数访问只允许同类的

10、成员函数访问protected允许同类及其派生类的成员函数访问允许同类及其派生类的成员函数访问public允许同一作用域的任何函数访问允许同一作用域的任何函数访问 在定义类时,指定其成员访问权限的原则:在定义类时,指定其成员访问权限的原则:仅供该类的成员函数访问的成员应指定为私有的。仅供该类的成员函数访问的成员应指定为私有的。若定义的成员在派生类中也需经常使用,则应指定若定义的成员在派生类中也需经常使用,则应指定其为保护的。其为保护的。若允许在类外使用成员时,应将其访问权限定义为若允许在类外使用成员时,应将其访问权限定义为公有的。公有的。11.4.3 11.4.3 类的成员函数及重载类的成员函

11、数及重载 成员函数必须在类体内给出原型说明,至于它成员函数必须在类体内给出原型说明,至于它的实现,可以放在类体内,也可以放在类体外。的实现,可以放在类体内,也可以放在类体外。当成员函数所含代码较少时,一般直接在当成员函数所含代码较少时,一般直接在类类中定义中定义该成员函数;该成员函数;当成员函数中所含代码较多时,通常只在类当成员函数中所含代码较多时,通常只在类中进行原型的说明,在中进行原型的说明,在类外类外对函数进行对函数进行定义定义。例:例:class Person class Person char name12;char name12;int age;int age;char sex4;

12、char sex4;public:public:void Print()void Print()coutname,age,sexendl;coutname,age,sexendl;/省略其它成员省略其它成员;在类中定义的在类中定义的成员函数成员函数 在类外定义成员函数时,函数名应该包含:在类外定义成员函数时,函数名应该包含:类名作用域分辩符(类名作用域分辩符(:)原函数名)原函数名 指明该函数是哪个类的成员指明该函数是哪个类的成员class Person char name12;int age;char sex4;public:void Print();/省略其它成员省略其它成员;void P

13、erson:Print()coutname,age,sex-数据成员名数据成员名 对象指针名对象指针名-成员函数名(参数表)成员函数名(参数表)访问对象的成员时,要注意成员的访问权限。访问对象的成员时,要注意成员的访问权限。例:例:#include class Rectangle float length,width;public:float Area()return length*width;float Perimeter()return 2*(length+width);以关键字以关键字classclass定义的类,成员定义的类,成员的缺省访问属性的缺省访问属性为为privatepriva

14、te。void main()Rectangle r;r.width=45;r.length=54.2;coutthe area of rectangle is r.Area()endl;coutthe perimeter of rectangle is r.Perimeter()endl;非法访问非法访问 私有成员!私有成员!#include#includeclass Rectangleclass Rectangle float length,width;float length,width;public:public:void void SetWidthSetWidth(float newW

15、idth)(float newWidth)width=newWidth;width=newWidth;void void SetLengthSetLength(float newLength)(float newLength)length=newLength;length=newLength;float Area()float Area()return length return length*width;width;float Perimeter()float Perimeter()return 2 return 2*(length+width);(length+width);例:例:voi

16、d main()void main()Rectangle r;Rectangle r;/定义对象定义对象 r.r.SetWidthSetWidth(45);(45);r.r.SetLengthSetLength(54.2);(54.2);coutThe area of rectangle is coutThe area of rectangle is r.Area()endl;r.Area()endl;coutThe perimeter of rectangle is coutThe perimeter of rectangle is r.Perimeter()endl;r.Perimeter

17、()endl;11.4.5 11.4.5 对象数组对象数组 若一个数组中每个元素都是同类型的对象,则若一个数组中每个元素都是同类型的对象,则称该数组为对象数组。称该数组为对象数组。定义一维对象数组的格式为:定义一维对象数组的格式为:;例例11.511.5 对象数组的使用。对象数组的使用。#include#include class Circleclass Circle int radius;int radius;public:public:void setRadius(int r)radius=r;void setRadius(int r)radius=r;int getRadius()ret

18、urn radius;int getRadius()return radius;double area()return 3.14 double area()return 3.14*radiusradius*radius;radius;void main()void main()Circle c3;Circle c3;c0.setRadius(6);c1.setRadius(2);c0.setRadius(6);c1.setRadius(2);c2.setRadius(15);c2.setRadius(15);for(int i=0;i3;i+)for(int i=0;i3;i+)coutrad

19、ius:ci.getRadius()coutradius:ci.getRadius(),area:ci.area()endl;,area:ci.area()this-thisthis指针具有如下的缺省说明:指针具有如下的缺省说明:Circle Circle*const this;const this;有时不得不显式使用有时不得不显式使用thisthis指针指针。数据成员名与函数成员的形参同名。数据成员名与函数成员的形参同名。例例:class Name class Name char char*namename;public:public:void SetName(char void SetNa

20、me(char*namename)if(name)if(name)this-this-name=new charstrlen(name)+1;name=new charstrlen(name)+1;strcpy(strcpy(this-this-name,name);name,name);else else this-this-name=NULL;name=NULL;引用对象本身。引用对象本身。例例:class Name class Name char char*name;name;public:public:void CopyName(Name&n)void CopyName(Name&n)

21、if(if(this=&nthis=&n)return;)return;/避免对象自我复制避免对象自我复制 delete name;delete name;if(n.name)if(n.name)name=new charstrlen(n.name)+1;name=new charstrlen(n.name)+1;strcpy(name,n.name);strcpy(name,n.name);else name=NULL;else name=NULL;11.5 11.5 构造函数和析构函数构造函数和析构函数 构造函数和析构函数:类的构造函数和析构函数:类的特殊成员特殊成员。构造函数:构造函数:

22、创建对象,并初始化对象的数据成员。创建对象,并初始化对象的数据成员。析构函数:析构函数:撤销对象,收回它所占内存,及完成其它清理工作。撤销对象,收回它所占内存,及完成其它清理工作。11.5.1 11.5.1 构造函数构造函数 构造函数的定义格式构造函数的定义格式 ClassName(ClassName()/函数体函数体它与所在类同名。它与所在类同名。它不得有返回值,甚至连关键字它不得有返回值,甚至连关键字voidvoid也不许有。也不许有。例:例:class Personclass Person char name12;char name12;int age;int age;char sex4

23、;char sex4;public:public:Person(const charPerson(const char*n,int a,const charn,int a,const char*s)s)strcpy(name,n);strcpy(name,n);age=a;age=a;strcpy(sex,s);strcpy(sex,s);/省略其它成员函数省略其它成员函数;例:例:class Personclass Person char name12;char name12;int age;int age;char sex4;char sex4;public:public:Person(c

24、onst charPerson(const char*n,int a,const char n,int a,const char*s)s);/其它成员函数说明其它成员函数说明;Person:Person(const charPerson:Person(const char*n,int a,const char n,int a,const char*s)s)strcpy(name,n);strcpy(name,n);age=a;age=a;strcpy(sex,s);strcpy(sex,s);也可在类中声明原也可在类中声明原型,在类外定义。型,在类外定义。构造函数的特殊性:构造函数的特殊性:构

25、造函数在定义类对象时由系统自动调用。构造函数在定义类对象时由系统自动调用。例:例:void main()void main()Person p(“Person p(“张三张三”,20,“”,20,“男男”);”);当遇此定义语句时,系统就调用构造函数:当遇此定义语句时,系统就调用构造函数:Person(const char Person(const char*n,int a,const char n,int a,const char*s)s)创建对象创建对象p p,并用实参初始化它的数据成员。,并用实参初始化它的数据成员。构造函数可以重载。构造函数可以重载。例:例:class Point cl

26、ass Point float x,y;float x,y;public:public:Point()x=0;y=0;Point()x=0;y=0;/(1)/(1)Point(float a,float b)x=a;y=b;Point(float a,float b)x=a;y=b;/(2)/(2)/;void main()void main()Point p1;Point p1;/匹配匹配(1)(1)Point p2(2.0,4.2);Point p2(2.0,4.2);/匹配匹配(2)(2)构造函数中初始化数据成员的方法构造函数中初始化数据成员的方法在函数体中用赋值等语句进行在函数体中用赋

27、值等语句进行 使用成员使用成员初始化列表初始化列表初始化列表初始化列表格式:格式:在形参表和函数体之间,以:号开头,由多个以在形参表和函数体之间,以:号开头,由多个以逗号分隔的初始化项构成。即逗号分隔的初始化项构成。即 :数据成员名数据成员名1(1(初值初值1),1),数据成员名数据成员名n(n(初值初值n)n)举例:举例:Person:Person()Person:Person():name(zhang),age(22):name(zhang),age(22)strcpy(sex,strcpy(sex,男男););执行顺序:执行顺序:带有初始化表的构造函数执行时,首先执带有初始化表的构造函数

28、执行时,首先执行初始化表,然后再执行函数体。行初始化表,然后再执行函数体。数据成员的初始化数据成员的初始化 普通数据成员的初始化既可在函数体进行,普通数据成员的初始化既可在函数体进行,也可在初始化表进行。也可在初始化表进行。例:例:(方法方法1)1)Point:Point(int x1,int y1)Point:Point(int x1,int y1)x=x1;y=y1;x=x1;y=y1;或或(方法方法2)2)Point:Point(int x1,int y1):x(x1),y(y1)Point:Point(int x1,int y1):x(x1),y(y1)constconst数据成员、数

29、据成员、constconst对象成员和从基类继对象成员和从基类继承的数据成员的初始化必须用初始化表。承的数据成员的初始化必须用初始化表。缺省的缺省的构造函数构造函数C+C+规定,每个类至少有一个构造函数,否则就不能规定,每个类至少有一个构造函数,否则就不能创建该类的对象。创建该类的对象。例:例:class Rectangleclass Rectangle float length,width;float length,width;public:public:float Area();float Area();float Perimeter();float Perimeter();/类的实现类的

30、实现void main()void main()Rectangle rect;Rectangle rect;能否创建能否创建RectangleRectangle类的对象?类的对象?类中若未定义构造函数,则类中若未定义构造函数,则C+C+编译系统自动提供一编译系统自动提供一个缺省的构造函数。缺省的构造函数无参,函数体为个缺省的构造函数。缺省的构造函数无参,函数体为空,仅创建对象,不作任何初始化工作。空,仅创建对象,不作任何初始化工作。class Rectangleclass Rectangle float length,width;float length,width;public:public

31、:float Area();float Area();float Perimeter();float Perimeter();/类的实现类的实现void main()void main()Rectangle rect;Rectangle rect;因系统提供了默认的因系统提供了默认的构造函数:构造函数:Rectangle()Rectangle()只要类中定义了一个构造函数,只要类中定义了一个构造函数,C+C+编译器就不再提编译器就不再提供缺省的构造函数,如还想要无参构造函数,则必供缺省的构造函数,如还想要无参构造函数,则必须自己定义。须自己定义。例:例:class Circle class C

32、ircle int radius;int radius;public:public:Circle(int r)Circle(int r)radius=r;radius=r;/(1)/(1);Circle c1;Circle c1;Circle c2(5);Circle c2(5);因该类有带一个参数的构因该类有带一个参数的构造函数,故系统不再提供造函数,故系统不再提供无参的无参的缺省缺省构造函数!构造函数!对上例的修改方法对上例的修改方法1 1:class Circleclass Circle int radius;int radius;public:public:Circle(int r)r

33、adius=r;Circle(int r)radius=r;/(1)/(1)Circle()Circle()/(2)/(2);Circle c1(3);Circle c1(3);Circle c2;Circle c2;添加无参构造函数!添加无参构造函数!对上例的修改方法对上例的修改方法2 2:class Circleclass Circle int radius;int radius;public:public:Circle(int Circle(int r=0r=0)radius=r;)radius=r;/(1)/(1);Circle c1(3);Circle c1(3);Circle c2

34、;Circle c2;参数带默认值的构造函数!参数带默认值的构造函数!所有参数都带默认值的构造函所有参数都带默认值的构造函数也是缺省的构造函数。数也是缺省的构造函数。使用参数带缺省值的构造函数时,应防二义性。如:使用参数带缺省值的构造函数时,应防二义性。如:class Circle class Circle int radius;int radius;public:public:Circle()/L1 Circle()/L1 Circle(int r=0)radius=r;/L2 Circle(int r=0)radius=r;/L2 ;Circle c1;/L3 Circle c1;/L3

35、错误!产生二义性错误!产生二义性 Circle c2(5);/Circle c2(5);/匹配匹配L2L2行的构造函数行的构造函数 当编译当编译L3L3行的语句时,出错。因行的语句时,出错。因CircleCircle类定义了两个类定义了两个缺省的构造函数,编译器不知道是调用缺省的构造函数,编译器不知道是调用L1L1行定义的行定义的Circle()Circle()还是调用还是调用L2L2行定义的行定义的Circle(int r=0)Circle(int r=0)。11.5.2 11.5.2 析构函数析构函数 作用:作用:与构造函数相反,在对象被撤消时由系统自动与构造函数相反,在对象被撤消时由系统

36、自动调用,做清理工作。调用,做清理工作。特点:特点:析构函数名必须与类名相同,并在其前面加上析构函数名必须与类名相同,并在其前面加上字符字符“”,以便和构造函数名相区别。,以便和构造函数名相区别。析构函数没有返回值,函数名前也不能用关键析构函数没有返回值,函数名前也不能用关键字字void。析构函数没有参数,换言之,析构函数是唯一析构函数没有参数,换言之,析构函数是唯一的,析构函数无法重载。的,析构函数无法重载。例例11.9 11.9 调用析构函数。调用析构函数。#include#include class Point class Point int x,y;int x,y;public:pub

37、lic:Point()Point()x=y=0;coutDefault constructor called.n;x=y=0;coutDefault constructor called.n;Point(int a,int b)Point(int a,int b)x=a;y=b;x=a;y=b;coutConstructor with parameters called.n;coutConstructor with parameters called.n;Point()Point()coutDestructor called.x,yn;coutDestructor called.x,yn;vo

38、id print()coutx,yn;void print()coutx,yn;为了观察调用构造函数和析为了观察调用构造函数和析构函数的过程,分别在构造构函数的过程,分别在构造函数和析构函数内添加了输函数和析构函数内添加了输出调用信息的语句。出调用信息的语句。void main()void main()Point p1(5,8),p2;Point p1(5,8),p2;p1.print();p1.print();p2.print();p2.print();Point p2(3,2);Point p2(3,2);p2.print();p2.print();coutExit main!n;cout

39、Exit main!n;程序运行结果:程序运行结果:Constructor with parameters called.Constructor with parameters called.Default constructor called.Default constructor called.5,85,80,00,0Constructor with parameters called.Constructor with parameters called.3,23,2Destructor called.3,2Destructor called.3,2Exit main!Exit main!

40、Destructor called.0,0Destructor called.0,0Destructor called.5,8Destructor called.5,8从该程序的输出结果看:从该程序的输出结果看:当创建对象时,系统自动调用相匹配的构造函数;当创建对象时,系统自动调用相匹配的构造函数;当撤销对象时,系统自动调用析构函数。当撤销对象时,系统自动调用析构函数。对象撤销的顺序与创建的顺序正好相反。对象撤销的顺序与创建的顺序正好相反。在相同的生存期的情况下,先创建的对象后撤销,在相同的生存期的情况下,先创建的对象后撤销,后创建的对象先撤销。后创建的对象先撤销。若类的定义中没有显式定义析构

41、函数,则编译器自动若类的定义中没有显式定义析构函数,则编译器自动为该类产生一个缺省的析构函数。其格式为:为该类产生一个缺省的析构函数。其格式为:ClassName:ClassName()ClassName:ClassName()它不执行任何操作。它不执行任何操作。无需显式定义析构函数的典型情况:无需显式定义析构函数的典型情况:撤消对象时不做任何清理工作。撤消对象时不做任何清理工作。需要显式定义析构函数的典型情况:需要显式定义析构函数的典型情况:类中包含指向动态内存的指针数据成员。由于它类中包含指向动态内存的指针数据成员。由于它们所指向的动态内存空间是对象自己管理的,因们所指向的动态内存空间是对

42、象自己管理的,因此在对象即将撤消时,需通过析构函数将所管理此在对象即将撤消时,需通过析构函数将所管理的动态内存空间及时释放。的动态内存空间及时释放。例例11.1011.10 使用析构函数,收回动态分配的存储空间。使用析构函数,收回动态分配的存储空间。#include#include#include#includeclass Personclass Person charchar*name;name;int age;int age;public:public:Person(char Person(char*n,int a)n,int a)if(n)if(n)name=new charstrlen

43、(n)+1;name=new charstrlen(n)+1;strcpy(name,n);strcpy(name,n);else name=0;else name=0;age=a;age=a;Person()Person()delete name;delete name;void Print()coutname,ageendl;void Print()coutname,ageendl;void main()Person p(“John”,20);p.Print();void main()Person p(“John”,20);p.Print();申请动态内存申请动态内存释放动态内存释放动态内

44、存 对象释放顺序:对象释放顺序:对象释放的顺序与创建的顺序正好相反。在相同的对象释放的顺序与创建的顺序正好相反。在相同的生存期的情况下,先创建的对象后释放,后创建的生存期的情况下,先创建的对象后释放,后创建的对象先释放。对象先释放。11.5.3 11.5.3 构造函数的类型转换功能构造函数的类型转换功能 如果类定义中提供了只带一个参数(没有其它如果类定义中提供了只带一个参数(没有其它参数,或其它参数都有缺省值)的构造函数,参数,或其它参数都有缺省值)的构造函数,则当一个其它类型的数值或变量则当一个其它类型的数值或变量x x赋值给该类赋值给该类的对象的对象A A时,由于类型不一致,系统自动以时,

45、由于类型不一致,系统自动以x x为为实参调用该类的实参调用该类的单参数构造函数单参数构造函数,创建一个该,创建一个该类的临时对象,并将该临时对象赋值给类的临时对象,并将该临时对象赋值给A A,从,从而实现了隐式类型转换。而实现了隐式类型转换。例例11.1111.11 构造函数完成类型转换功能的例子。构造函数完成类型转换功能的例子。#include#includeclass Moneyclass Money int yuan,jiao,fen;int yuan,jiao,fen;public:public:Money(double d)Money(double d)int t=d int t=d

46、*100;100;yuan=t/100;jiao=(t-yuan yuan=t/100;jiao=(t-yuan*100)/10;fen=t%10;100)/10;fen=t%10;Money(int y=0,int j=0,int f=0)Money(int y=0,int j=0,int f=0)yuan=y;jiao=j;fen=f;yuan=y;jiao=j;fen=f;void print()void print()coutyuan“coutyuan“元元”jiao“”jiao“角角”fen“”fen“分分n;n;单参数单参数构造函数构造函数void main()void main(

47、)Money m1(25,5,7),m2(2.65);Money m1(25,5,7),m2(2.65);m1.print();m1.print();m2.print();m2.print();Money m3=4.57;Money m3=4.57;m3.print();m3.print();m3=3.29;m3=3.29;m3.print();m3.print();隐式类型转换:调用单参数构隐式类型转换:调用单参数构造函数,创建造函数,创建MoneyMoney类型的临类型的临时对象。时对象。并不做隐式类型转换,等价于:并不做隐式类型转换,等价于:Money m3(4.57);Money m3

48、(4.57);11.5.4 11.5.4 拷贝构造函数拷贝构造函数 拷贝构造函数:特殊的构造函数,其形参是本类的对拷贝构造函数:特殊的构造函数,其形参是本类的对象的引用,其作用是使用一个已经存在的对象象的引用,其作用是使用一个已经存在的对象(由拷贝由拷贝构造函数的参数指定的对象构造函数的参数指定的对象)去初始化一个新的同类的去初始化一个新的同类的对象。对象。定义一个拷贝构造函数的一般形式为:定义一个拷贝构造函数的一般形式为:ClassName:ClassName(ClassName&c)ClassName:ClassName(ClassName&c)././函数体完成对应数据成员的赋值函数体完

49、成对应数据成员的赋值 例例11.12 11.12 使用完成拷贝功能的构造函数。使用完成拷贝功能的构造函数。#include#include#include#includeclass Pointclass Point int x,y;int x,y;public:public:Point(int a=0,int b=0)x=a;y=b;Point(int a=0,int b=0)x=a;y=b;Point(Point&t)Point(Point&t)/拷贝构造函数拷贝构造函数 x=t.x;y=t.y;x=t.x;y=t.y;cout cout调用了拷贝构造函数调用了拷贝构造函数!n;!n;int

50、 GetX()return x;int GetX()return x;int GetY()return y;int GetY()return y;void Show()coutx=x,y=yn;void Show()coutx=x,y=yn;double Distance(Point p1,Point p2)double Distance(Point p1,Point p2)int dx=p1.GetX()-p2.GetX();int dx=p1.GetX()-p2.GetX();int dy=p1.GetY()-p2.GetY();int dy=p1.GetY()-p2.GetY();ret

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(第11章类和对象课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|