第11章类和对象.ppt

上传人:本田雅阁 文档编号:2576695 上传时间:2019-04-11 格式:PPT 页数:94 大小:350.51KB
返回 下载 相关 举报
第11章类和对象.ppt_第1页
第1页 / 共94页
第11章类和对象.ppt_第2页
第2页 / 共94页
第11章类和对象.ppt_第3页
第3页 / 共94页
亲,该文档总共94页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第11章类和对象.ppt》由会员分享,可在线阅读,更多相关《第11章类和对象.ppt(94页珍藏版)》请在三一文库上搜索。

1、第11章 类和对象,11.1 面向对象的思想 11.2 面向对象程序设计的基本特点 11.3 面向对象软件开发的基本过程 11.4 类和对象 11.5 构造函数与析构函数 11.6 友元 11.7 静态成员 11.8 const对象和成员函数 11.9 应用实例 作业:10,13,14,15,11.1 面向对象的思想,什么是面向过程?什么是面向对象? 两种不同的思想、方法。 面向过程的程序设计 用传统程序设计语言进行程序设计时,必须详细地描述解题的过程。程序设计工作主要围绕设计解题过程来进行,这种传统的程序设计方法称为面向过程的程序设计。,面向过程程序设计,特点 程序处理数据的一系列过程; 数

2、据与过程分离; 程序数据结构算法 缺点 重用性差 维护困难,面向对象程序设计,面向对象程序设计:将面向对象方法用于程序设计。 出发点与基本原则: 模拟人类习惯思维方式,使开发软件的方法尽可能接近人类认识世界解决问题的方法。 对象作为模块,对象是对客观事物的自然的、直接的抽象和模拟,包含了数据及对数据的操作。,11.2 面向对象程序设计的基本特点,封装性 将描述对象的数据及处理这些数据的代码集中起来放在对象内部,对象成为独立模块。 继承性 从已有类(称为基类)派生出新类。 多态性 同一个名字代表不同、但相似的功能。,11.3 面向对象软件开发的基本过程,软件危机促进了软件工程的形成与发展。 软件

3、工程:用系统工程学的原理和方法管理软件开发过程,开发过程分为分析、设计、编程、测试、维护等阶段。 面向对象的软件工程 分析:明确系统必须做什么。 设计:明确软件系统怎么做。 实现:选用合适的面向对象编程语言,实现设计阶段描述的软件系统的各个类模块,并根据类的相互关系集成。 测试:发现软件中的错误。 维护:在软件交付用户使用期间,对软件所作的修改。,11.4 类和对象,在面向对象程序设计中,对象是构成程序的模块,即程序是由一组对象构成的,对象之间通过消息分工协作,共同完成程序的功能。 类是面向对象程序设计的核心,是对具有相同属性与行为的一组事物的抽象描述。利用类可以把数据和对数据所做的操作组合成

4、一个整体,实现对数据的封装和隐藏。 类是用户自定义的数据类型,是创建对象的模型。,11.4.1 类的定义,1格式,关键字,class 类名 成员1说明; 成员2说明; 成员n说明; ;,类定义体,分号不可缺!,2类的组成成员 数据成员: 变量或对象。其类型为:,成员函数 对数据成员进行操作。,例: class Circle private: int radius; public: void setRadius(int r) radius=r; double area( ) return 3.14*radius*radius; ;,数据成员,函数成员1,?,函数成员2,在定义一个类时,注意: 类

5、只是一种自定义数据类型,类中任何成员数据均不能使用关键字extern、auto或register指定其存储类型,也不能初始化。例如: class Circle int radius=5; /错误 extern float pi; /错误 /省略其它成员 ; 成员函数可直接使用类中的任一成员。 类类型与结构体类型相似,结构体类型也可有函数成员,差别在于,类类型的缺省访问权限是private,结构体类型的缺省访问权限是public。,11.4.2 类成员的访问控制,在定义类时,指定其成员访问权限的原则: 仅供该类的成员函数访问的成员应指定为私有的。 若定义的成员在派生类中也需经常使用,则应指定其为

6、保护的。 若允许在类外使用成员时,应将其访问权限定义为公有的。,11.4.3 类的成员函数及重载,成员函数必须在类体内给出原型说明,至于它的实现,可以放在类体内,也可以放在类体外。 当成员函数所含代码较少时,一般直接在类中定义该成员函数; 当成员函数中所含代码较多时,通常只在类中进行原型的说明,在类外对函数进行定义。,例: class Person char name12; int age; char sex4; public: void Print( ) coutname,age,sexendl; /省略其它成员 ;,在类中定义的成员函数,在类外定义成员函数时,函数名应该包含: 类名作用域分

7、辩符(:)原函数名,指明该函数是哪个类的成员,class Person char name12; int age; char sex4; public: void Print ( ) ; /省略其它成员 ; void Person : Print( ) coutname,age,sexendl; ,例:,在类中声明成员函数的原型,在类外定义成员函数,类的成员函数可以重载,例: class Person char name12; int age; char sex4; public: void SetPerson(const char*,int,const char* =“女“); void S

8、etPerson(int); /省略其它成员 ;,成员函数重载,缺省参数,11.4.4 对象,对象的本质 一个对象就是一个类的实例。一个对象就是一个具有某种类类型的变量。 对象的定义格式: 类名 对象名;,例: Person p1,p2;,公共代码区,SetPerson() GetName() GetSex() Print(),p1 p2,访问对象的成员,对象名.数据成员名 对象名.成员函数名(参数表) 对象指针名-数据成员名 对象指针名-成员函数名(参数表),访问对象的成员时,要注意成员的访问权限。,例: #include class Rectangle float length,width

9、; public: float Area( ) return length*width; float Perimeter( ) return 2*(length+width); ;,private:,以关键字class定义的类,成员的缺省访问属性为private。,void main( ) Rectangle r; r.width=45; r.length=54.2; cout“the area of rectangle is“ r.Area()endl; cout“the perimeter of rectangle is“ r.Perimeter()endl; ,非法访问 私有成员!,#i

10、nclude class Rectangle float length,width; public: void SetWidth(float newWidth) width=newWidth; void SetLength(float newLength) length=newLength; float Area( ) return length*width; float Perimeter( ) return 2*(length+width); ;,例:,void main( ) Rectangle r; /定义对象 r.SetWidth(45); r.SetLength(54.2); co

11、ut“The area of rectangle is“ r.Area( )endl; cout“The perimeter of rectangle is “ r. Perimeter( )endl; ,11.4.5 对象数组,若一个数组中每个元素都是同类型的对象,则称该数组为对象数组。 定义一维对象数组的格式为: ;,例11.5 对象数组的使用。 #include class Circle int radius; public: void setRadius(int r) radius=r; int getRadius( ) return radius; double area( ) re

12、turn 3.14*radius*radius; ; void main( ) Circle c3; c0.setRadius(6); c1.setRadius(2); c2.setRadius(15); for(int i=0;i3;i+) cout“radius:“ci.getRadius( ) “,area:“ci.area( )endl; ,类Circle的定义,定义对象数组,11.4.6 this指针,一个成员函数被调用时,系统自动向它传递一个隐含的指针,该指针是调用该成员函数的对象的指针,在成员函数的函数体中可直接用this使用该指针。 在成员函数的实现中,当访问该对象的某成员时,

13、系统自动使用这个隐含的this指针。在定义成员函数的函数体时,通常省略this指针。 例:Circle类的成员函数 void setRadius(int r) radius=r; ,this-,this指针具有如下的缺省说明: Circle *const this;,有时不得不显式使用this指针。 数据成员名与函数成员的形参同名。例: class Name char* name; public: void SetName(char* name) if(name) this-name=new charstrlen(name)+1; strcpy(this-name,name); else th

14、is-name=NULL; ;,引用对象本身。例: class Name char* name; public: void CopyName(Name,11.5 构造函数和析构函数,构造函数和析构函数:类的特殊成员。 构造函数: 创建对象,并初始化对象的数据成员。 析构函数: 撤销对象,收回它所占内存,及完成其它清理工作。,11.5.1 构造函数,构造函数的定义格式 ClassName() /函数体,它与所在类同名。 它不得有返回值,甚至连关键字void也不许有。,例:,class Person char name12; int age; char sex4; public: Person(c

15、onst char*n,int a,const char*s) strcpy(name,n); age=a; strcpy(sex,s); /省略其它成员函数 ;,例:,class Person char name12; int age; char sex4; public: Person(const char* n,int a,const char* s); /其它成员函数说明 ; Person:Person(const char* n,int a,const char* s) strcpy(name,n); age=a; strcpy(sex,s); ,也可在类中声明原型,在类外定义。,构

16、造函数的特殊性:,构造函数在定义类对象时由系统自动调用。例:,void main( ) Person p(“张三”,20, “男” ); ,当遇此定义语句时,系统就调用构造函数: Person(const char* n,int a,const char* s) 创建对象p,并用实参初始化它的数据成员。,构造函数可以重载。例:,class Point float x,y; public: Point( )x=0;y=0; /(1) Point(float a,float b)x=a;y=b; /(2) / ; void main( ) Point p1; /匹配(1) Point p2(2.0

17、,4.2); /匹配(2) ,构造函数中初始化数据成员的方法,在函数体中用赋值等语句进行 使用成员初始化列表,初始化列表,格式: 在形参表和函数体之间,以:号开头,由多个以逗号分隔的初始化项构成。即 :数据成员名1(初值1),数据成员名n(初值n) 举例: Person:Person( ):name(“zhang“),age(22) strcpy(sex,“男“); 执行顺序:带有初始化表的构造函数执行时,首先执行初始化表,然后再执行函数体。,数据成员的初始化,普通数据成员的初始化既可在函数体进行,也可在初始化表进行。例:,(方法1) Point:Point(int x1,int y1) x=

18、x1; y=y1; 或(方法2) Point:Point(int x1,int y1):x(x1),y(y1) ,const数据成员、const对象成员和从基类继承的数据成员的初始化必须用初始化表。,缺省的构造函数,C+规定,每个类至少有一个构造函数,否则就不能创建该类的对象。例:,class Rectangle float length,width; public: float Area( ); float Perimeter( ); ; /类的实现 void main( ) Rectangle rect; ,能否创建Rectangle类的对象?,类中若未定义构造函数,则C+编译系统自动提供

19、一个缺省的构造函数。缺省的构造函数无参,函数体为空,仅创建对象,不作任何初始化工作。,class Rectangle float length,width; public: float Area( ) ; float Perimeter( ); ; /类的实现 void main( ) Rectangle rect; ,因系统提供了默认的构造函数: Rectangle( ) ,只要类中定义了一个构造函数,C+编译器就不再提供缺省的构造函数,如还想要无参构造函数,则必须自己定义。例: class Circle int radius; public: Circle(int r) radius=r;

20、 /(1) ; Circle c1; Circle c2(5);,因该类有带一个参数的构造函数,故系统不再提供无参的缺省构造函数!,匹配(1),没有无参构造函数,对上例的修改方法1: class Circle int radius; public: Circle(int r) radius=r; /(1) Circle( ) /(2) ; Circle c1(3); Circle c2;,匹配(1),匹配(2),添加无参构造函数!,对上例的修改方法2 : class Circle int radius; public: Circle(int r=0) radius=r; /(1) ; Circ

21、le c1(3); Circle c2;,匹配(1),匹配(1),参数带默认值的构造函数! 所有参数都带默认值的构造函数也是缺省的构造函数。,使用参数带缺省值的构造函数时,应防二义性。如: class Circle int radius; public: Circle() /L1 Circle(int r=0) radius=r; /L2 ; Circle c1; /L3 错误!产生二义性 Circle c2(5); /匹配L2行的构造函数 当编译L3行的语句时,出错。因Circle类定义了两个缺省的构造函数,编译器不知道是调用L1行定义的Circle( )还是调用L2行定义的Circle(i

22、nt r=0)。,11.5.2 析构函数,作用: 与构造函数相反,在对象被撤消时由系统自动调用,做清理工作。 特点: 析构函数名必须与类名相同,并在其前面加上字符“”,以便和构造函数名相区别。 析构函数没有返回值,函数名前也不能用关键字void。 析构函数没有参数,换言之,析构函数是唯一的,析构函数无法重载。,例11.9 调用析构函数。 #include class Point int x,y; public: Point() x=y=0;cout“Default constructor called.n“; Point(int a,int b) x=a;y=b; cout“Construct

23、or with parameters called.n“; Point( ) cout“Destructor called.“x,yn; void print( ) coutx,yn; ;,为了观察调用构造函数和析构函数的过程,分别在构造函数和析构函数内添加了输出调用信息的语句。,void main( ) Point p1(5,8),p2; p1.print( ); p2.print( ); Point p2(3,2); p2.print(); cout“Exit main!n“; ,程序运行结果: Constructor with parameters called. Default con

24、structor called. 5,8 0,0 Constructor with parameters called. 3,2 Destructor called.3,2 Exit main! Destructor called.0,0 Destructor called.5,8,从该程序的输出结果看: 当创建对象时,系统自动调用相匹配的构造函数; 当撤销对象时,系统自动调用析构函数。 对象撤销的顺序与创建的顺序正好相反。 在相同的生存期的情况下,先创建的对象后撤销,后创建的对象先撤销。,若类的定义中没有显式定义析构函数,则编译器自动为该类产生一个缺省的析构函数。其格式为: ClassNam

25、e:ClassName( ) 它不执行任何操作。 无需显式定义析构函数的典型情况: 撤消对象时不做任何清理工作。 需要显式定义析构函数的典型情况: 类中包含指向动态内存的指针数据成员。由于它们所指向的动态内存空间是对象自己管理的,因此在对象即将撤消时,需通过析构函数将所管理的动态内存空间及时释放。,例11.10 使用析构函数,收回动态分配的存储空间。 #include #include class Person char* name; int age; public: Person(char* n,int a) if(n) name=new charstrlen(n)+1; strcpy(na

26、me,n); else name=0; age=a; Person( ) delete name; void Print() coutname,ageendl; ; void main( ) Person p(“John”,20); p.Print( ); ,申请动态内存,释放动态内存,对象释放顺序: 对象释放的顺序与创建的顺序正好相反。在相同的生存期的情况下,先创建的对象后释放,后创建的对象先释放。,11.5.3 构造函数的类型转换功能,如果类定义中提供了只带一个参数(没有其它参数,或其它参数都有缺省值)的构造函数,则当一个其它类型的数值或变量x赋值给该类的对象A时,由于类型不一致,系统自动

27、以x为实参调用该类的单参数构造函数,创建一个该类的临时对象,并将该临时对象赋值给A,从而实现了隐式类型转换。,例11.11 构造函数完成类型转换功能的例子。 #include class Money int yuan,jiao,fen; public: Money (double d) int t=d*100; yuan=t/100;jiao=(t-yuan*100)/10;fen=t%10; Money (int y=0,int j=0,int f=0) yuan=y;jiao=j;fen=f; void print( ) coutyuan“元”jiao“角”fen“分n“; ;,单参数 构

28、造函数,void main( ) Money m1(25,5,7),m2(2.65); m1.print( ); m2.print( ); Money m3=4.57; m3.print( ); m3= 3.29 ; m3.print( ); ,隐式类型转换:调用单参数构造函数,创建Money类型的临时对象。,并不做隐式类型转换,等价于: Money m3(4.57);,11.5.4 拷贝构造函数,拷贝构造函数:特殊的构造函数,其形参是本类的对象的引用,其作用是使用一个已经存在的对象(由拷贝构造函数的参数指定的对象)去初始化一个新的同类的对象。 定义一个拷贝构造函数的一般形式为: ClassN

29、ame:ClassName(ClassName &c) . /函数体完成对应数据成员的赋值,例11.12 使用完成拷贝功能的构造函数。 #include #include class Point int x,y; public: Point(int a=0,int b=0) x=a;y=b; Point(Point,double Distance(Point p1,Point p2) int dx=p1.GetX()-p2.GetX(); int dy=p1.GetY()-p2.GetY(); return sqrt(dx*dx+dy*dy); Point Mid(Point ,函数Dista

30、nce(Point,Point)的形参为类的对象,当执行函数调用distance(p0,p3)时,实参初始化形参,两次调用拷贝构造函数,分别用实参对象p0和p3初始化形参对象p1和p2。 若函数形参是对象的引用,则调用该函数时,不调用拷贝构造函数,如本例的Mid函数所示。,结果(VC6 with sp6): 调用了拷贝构造函数! 调用了拷贝构造函数! x=8,y=15 x=8,y=15 x=8,y=15 调用了拷贝构造函数! 调用了拷贝构造函数! 8.06226,默认拷贝构造函数: 若定义类时未显式定义该类的拷贝构造函数,则编译系统会在编译该类时自动生成一个默认拷贝构造函数。 默认拷贝构造函数

31、的功能是把一个已经存在的对象的每个数据成员的值逐个复制到新建立对象对应的数据成员中。 例11.12中类Point的拷贝构造函数与默认的拷贝构造函数功能一样,不必显式定义。 何时显式定义拷贝构造函数?若类中包含指向动态内存的指针时,用默认的拷贝构造函数初始化对象,将带来严重问题,如例11.13所示。,例11.13 默认拷贝的构造函数。 #include #include class String char *p; public: String(char*c=0) if(c) p=new charstrlen(c)+1; strcpy(p,c); else p=NULL; String( ) de

32、lete p; void Show( ) cout“string=“pn; ;,void main( ) String s1(“student“); String s2(s1);/A s1.Show( ); s2.Show( ); ,s1.p,s1,堆内存,s2.p,s2,执行A行语句:调用默认拷贝构造函数,用s1对象初始化s2对象,使s2对象的成员指针p与s1对象的成员指针p指向同一片内存。 主函数结束:先撤消s2,s2对象释放其所指动态内存;其后撤销s1对象,但因s1对象所指动态内存已被s2对象释放,造成重复释放同一块动态内存,出现运行错误。 定义拷贝构造函数,避免上述错误: String

33、(String ,s,t,u,d,e,n,0,t,11.5.5 对象成员与构造函数,对象成员:一个类的对象可做另一个类的数据成员。 例如: class Date int year,month,day; public: Date(int y,int m,int d) year=y;month=m;day=d; ; class Person char name12; char sex4; Date birthday; /对象成员 public: Person(char*, char*,int,int,int); ;,对象成员的初始化 通过初始化表进行,如: Person:Person(char*n

34、,char*s,int y,int m,int d) :birthday(y,m,d) strcpy(name,n); strcpy(sex,s); 若未在初始化表中初始化对象成员,则系统自动调用该对象成员的缺省的构造函数来初始化。 若类中包含对象成员,则在创建该类的对象时,先调用对象成员的构造函数,初始化相应的对象成员,后执行该类的构造函数,初始化该类的其他成员。 如果一个类包含多个对象成员,对象成员的构造函数的调用顺序由它们在该类中的说明顺序决定,而与它们在初始化表中的顺序无关。,例11.14 初始化对象成员。 #include class Point int x,y; public: P

35、oint(int a,int b) x=a; y=b; cout“Constructor of class Point is called.n“; void Show( ) cout“x=“x“,y=“yendl; ;,class Rectangle Point p; int length,width; public: Rectangle(int l,int w,int a,int b):p(a,b) length=l; width=w; cout“Constructor of class Rectangle is called.n“; void Show( ) p.Show( ); cout

36、“length=“length“,width=“widthendl; ; void main( ) Rectangle r(5,4,45,55); r.Show( ); ,程序运行结果: Constructor of class Point is called. Constructor of class Rectangle is called. x=45,y=55 length=5,width=4,11.6 友元,有时需要在对象外部频繁访问对象私有的或保护的数据成员,若通过调用公有成员函数间接访问,由于参数传递、类型检查等都需占用时间,必然降低程序的运行效率。 使用友元可在对象外部直接访问对象

37、私有的和保护的数据成员。 友元以类的封装性的有限破坏为代价来提高程序的运行效率,应谨慎使用。 友元分为:友元函数和友元类。,11.6.1 友元函数,友元函数的说明格式: friend FuncName(); 例11.15 用友元函数的方法计算两点距离。 #include #include class Point int x,y; public: Point(int i=0,int j=0) x=i;y=j; int GetX( ) return x; int GetY( ) return y; friend double distance(Point,普通函数distance( )声明为Poi

38、nt类的友元函数。,double distance(Point ,程序运行结果: The distance is:9.43398,友元函数distance( )可通过对象名直接访问Point类的对象p1和p2的私有数据成员x和y,提高了程序的效率。,友元函数说明: 友元函数应在类中说明,可放在类的私有、公有或保护部分,效果一样。友元函数体可在类内或类外定义。 友元函数不是类的成员,不带this指针,因此必须将对象名或对象的引用作为友元函数的参数,并在函数体中用运算符“.”来访问对象的成员。如上例中的p1.x。 友元函数可直接访问相关类中的所有成员。 一个类的成员函数也可作为另一个类的友元函数,

39、例如: class A int f(); ; class B /成员定义 friend int A:f();/声明类A的成员函数f( ) ; / 是类B的友元,在声明这个友元函数时需要在函数名前面加上它的类名和作用域运算符“:”。,11.6.2 友元类,若声明A类为B类的友元,则A类的所有成员函数都成为B类的友元函数。有时友元类的使用也是必要的选择。 例11.16 友元类。 #include #include class Date int year,month,day; public: Date(int y=0,int m=0,int d=0) year=y;month=m;day=d; vo

40、id display() coutyearmonthday; friend class Person; ;,class Person char name12; char sex4; Date birthday; public: Person(char*n,int y,int m,int d,char*s) strcpy(name,n); strcpy(sex,s); birthday.year=y; birthday.month=m; birthday.day=d; void display( ) cout“name:“name“,sex:“sex; cout“,birthday:“birth

41、day.year. birthday.month.birthday.dayendl; ; void main( ) Person p(“张三”,1983,8,20,”男”); p.display( ); ,程序运行结果: name:张三,sex:男,birthday:1983.8.20,因Person类为Date类的友元,在Person类的成员函数可直接操作Date类的对象birthday的数据成员。,友元的其它注意事项: 友元关系没有传递性。例如,说明类A是类B的友元,类B是类C的友元时,类A并不一定是类C的友元。 友元关系不具有交换性,即说明类A为类B的友元时,类B并不一定是类A的友元。

42、友元关系没有继承性。因友元函数不是类的成员函数,当然不存在继承关系。 谨慎使用友元。友元提高程序的运行效率是通过破坏类的封装性取得的,若过多过滥使用友元,则会严重降低程序的可维护性。,11.7 类的静态成员,分类:,静态数据成员,静态成员函数,11.7.1 静态数据成员,静态数据成员的必要性,/学生类 class Student int No; char *name; ,若要统计学生总数,这个数据存放在什么地方呢?,类外变量?,不能实现数据的隐藏!,类中增加数据成员?,冗余!不一致!,静态数据成员的定义:先在类体内,做引用性说明,即在该成员名的类型说明符前加关键字static。后在文件作用域做

43、定义性说明。,例: class Student int No; char *name; static int count;/引用性说明:说明静态 /数据成员count的访问权限和作用域 ; int Student:count=0;/定义性说明:为静态 /数据成员count分配内存和初始化,与普通数据成员的区别:类的普通数据成员在类的每个对象中都拥有一个拷贝;而静态数据成员,每个类只有一个拷贝,由该类的所有对象共同维护和使用,从而实现了同一类的不同对象之间的数据共享。,例:void main( ) Student s1,s2; ,count,静态存储区,s1与s2共有,静态数据成员的引用: 类名

44、:静态数据成员名 或 对象名.静态数据成员名 或 对象指针-静态数据成员名 访问静态数据成员时也要注意访问权限。,例11.17 具有静态数据成员的Apple类。,#include class Apple float weight; static int count;/静态数据成员的引用性说明 static float total_weight; public: Apple(float=0); Apple( ); void Show( ); ;,Apple:Apple(float w) weight=w; count+; total_weight+=weight; cout“Number of

45、apples=“countn; Apple: Apple( ) count-; total_weight-=weight; cout“Number of apples=“countn; void Apple: Show( ) cout“weight=“weight “,total_weight=“total_weightn; ,/静态数据成员的定义性说明:默认值为0 int Apple:count; float Apple:total_weight; void main( ) Apple redone(100); Apple greenone(200); Apple yellowone(250

46、); redone.Show( ); greenone.Show( ); yellowone.Show( ); ,11.7.2 静态成员函数,采用静态函数成员的好处是可以不依赖于任何对象,直接访问静态数据成员。 静态成员函数的定义格式: static 返回值类型 成员函数名(参数表); 静态成员函数的引用格式: :() 或 .(),例11.18 具有静态数据成员和静态成员函数的Apple类。,#include class Apple float weight; static int count; static float total_weight; public: Apple(float=0)

47、; Apple(); void ShowWeight(); static void ShowCount(); static void ShowTotalWeight(); ;,Apple:Apple(float w) weight=w;count+; total_weight+=weight; cout“Number of apples=“countn; Apple:Apple( ) count-; total_weight-=weight; cout“Number of apples=“countn; void Apple: ShowWeight( ) cout“weight=“weightn; void Apple:ShowCount( ) cout“Number of apples=“countn; void Apple:ShowTotalWeight( )

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1