《第3章类与对象优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第3章类与对象优秀PPT.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 类与对象类与对象现在学习的是第1页,共71页3.1 类类返回首页返回首页3.1.1 类的定义类的定义3.1.2 类成员的访问控制类成员的访问控制3.1.3 成员函数的实现成员函数的实现现在学习的是第2页,共71页3.1.1 类的定义类的定义C+C+语言的类:语言的类:是一种用户自己定义的数据类型,和其他数据是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有类型不同的是,组成这种类型的不仅可以有数据数据,而且可以有对数据进行操作的而且可以有对数据进行操作的函数函数。C+C+规定,任何数据类型都必须规定,任何数据类型都必须先定义后使先定义后使用用,类也不例外
2、。,类也不例外。现在学习的是第3页,共71页3.1.1 类的定义类的定义返回本节返回本节 一般形式为:一般形式为:class 类名类名public:protected:private:;有效的C+标识符,不能是关键字。分号“;”类声明的结束标志数据成员和成员函数访问控制现在学习的是第4页,共71页3.1.2 类成员的访问控制类成员的访问控制 访问控制用于控制类中成员在访问控制用于控制类中成员在程序中的可访问性。程序中的可访问性。u public:公有:公有u protected:保护:保护u private:私有:私有 所有成员所有成员缺省缺省定义为定义为private。返回本节返回本节公有成
3、员定义了类的外部接口。私有成员是被隐藏的部分,只有该类的成员函数或友元才可以访问。保护成员具有公有成员和私有成员的双重性质,可以被该类或派生类的成员函数或友元访问。现在学习的是第5页,共71页3.1.3 成员函数的实现成员函数的实现 成员函数的实现,可以放在类体内,也可以成员函数的实现,可以放在类体内,也可以放在类体外,但放在类体外,但必须在类体内给出原型说明必须在类体内给出原型说明。放在类体内定义的函数被默认为放在类体内定义的函数被默认为内联函数内联函数,而放在类体外定义的函数是一般函数,如果要定而放在类体外定义的函数是一般函数,如果要定义为内联函数则需在前面加上关键字义为内联函数则需在前面
4、加上关键字inline。现在学习的是第6页,共71页3.1.3 成员函数的实现成员函数的实现在在类体外类体外定义成员函数的一般形式为:定义成员函数的一般形式为::()函数体函数体 “:”称为作用域运算符,“:”表明其后的成员函数是在这个类中声明的。现在学习的是第7页,共71页3.1.3 成员函数的实现成员函数的实现【例例3.13.1】定定义义一一个个点点类类(PointPoint),示示例例类类体体内内实实现现成成员函数员函数现在学习的是第8页,共71页3.1.3 成员函数的实现成员函数的实现【例【例3.23.2】定义一个点类(】定义一个点类(PointPoint),示例类体外实现成员),示例
5、类体外实现成员函数函数现在学习的是第9页,共71页3.1.3 成员函数的实现成员函数的实现 为了减少代码的重复,加快编译速度,在大型程序设计中,为了减少代码的重复,加快编译速度,在大型程序设计中,C+C+的类结构常常被分成两部分:一部分是类的的类结构常常被分成两部分:一部分是类的界面界面,另一部,另一部分是类的分是类的实现实现。在类的界面中仅包括类的所有数据成员以及成员函在类的界面中仅包括类的所有数据成员以及成员函数的函数原型,放在头文件中,供所有相关应用程序共数的函数原型,放在头文件中,供所有相关应用程序共享。而对于类的实现,即成员函数实现则放在与头文件享。而对于类的实现,即成员函数实现则放
6、在与头文件同名的源文件中,便于修改。这种做法还有利于为一个同名的源文件中,便于修改。这种做法还有利于为一个类的同一界面提供不同的内部实现。类的同一界面提供不同的内部实现。现在学习的是第10页,共71页3.1.3 成员函数的实现成员函数的实现【例【例3.33.3】按类的界面与类的实现两部分来重新定义一】按类的界面与类的实现两部分来重新定义一个点类(个点类(PointPoint)。)。返回本节返回本节/Li3_3.hclass Point public:void setxy(int,int);void displayxy();private:int X,Y;现在学习的是第11页,共71页3.1.3
7、 成员函数的实现成员函数的实现返回本节返回本节/Li3_3.cpp#include#include Li3_3.husing namespace std;void Point:setxy(int x,int y)X=x;Y=y;void Point:displayxy()cout(X,Y)endl;现在学习的是第12页,共71页3.2 对象对象返回首页返回首页3.2.1 对象的声明对象的声明3.2.2 对象的创建和撤消对象的创建和撤消3.2.3 对象成员的访问对象成员的访问现在学习的是第13页,共71页返回本节返回本节3.2.1 对象的声明对象的声明 类实际上是由一个类定义的类型,称为类类型。
8、具有类实际上是由一个类定义的类型,称为类类型。具有类类型的变量称为类类型的变量称为对象对象。对象的声明与普通变量相似,一般格式为:对象的声明与普通变量相似,一般格式为:;例如,声明类例如,声明类PointPoint的对象:的对象:Point p1,p2,*pdate,p3,&rp=p1;现在学习的是第14页,共71页类比:类比:定义一个整型变量定义一个整型变量 int a;int a;定义一个点对象定义一个点对象 Point d;Point d;类型变量类型(用户定义类)变量(对象)类就是(用自定义)类型,对象是类的变量。3.2.1 对象的声明对象的声明现在学习的是第15页,共71页3.2.2
9、 对象的创建和撤消对象的创建和撤消 在程序运行时,通过为对象分配存储空间来在程序运行时,通过为对象分配存储空间来创建对象。创建对象时,类被用作创建对象。创建对象时,类被用作模板模板,对象称,对象称为类的为类的实例实例。为对象分配存储空间主要有为对象分配存储空间主要有静态分配静态分配和和动态分动态分配配两种方式。两种方式。只有只有堆对象堆对象采用动态分配方式。采用动态分配方式。现在学习的是第16页,共71页3.2.2 对象的创建和撤消对象的创建和撤消 静态分配方式静态分配方式:在声明对象时分配存储空间,:在声明对象时分配存储空间,对象生命期结束时收回所分配存储空间。对象生命期结束时收回所分配存储
10、空间。例如声明:例如声明:Point p1,p2,p3;此时即创建对象此时即创建对象p1p1,p2p2和对象数组和对象数组p p。现在学习的是第17页,共71页3.2.2 对象的创建和撤消对象的创建和撤消 动态分配方式动态分配方式:Point*P=new Point(10,10);Point*P=new Point(10,10);delete p;delete p;对象的创建和销毁是由程序员决定的。对象的创建和销毁是由程序员决定的。Point*pdate;Point*pdate;此时只创建了对象指针此时只创建了对象指针pdatepdate,并没有创建,并没有创建pdatepdate所指向的所指
11、向的对象对象。返回本节返回本节现在学习的是第18页,共71页3.2.3 对象成员的访问对象成员的访问u用成员选择运算符用成员选择运算符“.”访问一般访问一般对象对象的成员:的成员:.()u用用成员选择运算符成员选择运算符“.”访问访问对象引用对象引用的成员:的成员:.()现在学习的是第19页,共71页3.2.3 对象成员的访问对象成员的访问u用成员选择运算符用成员选择运算符“-”访问对象指针的成员:访问对象指针的成员:-()或者或者(*(*).(*(*).()现在学习的是第20页,共71页3.2.3 对象成员的访问对象成员的访问【例【例3.43.4】利用例】利用例3.33.3中定义的类,示例对
12、象的声明和对成中定义的类,示例对象的声明和对成员访问方法。员访问方法。返回本节返回本节现在学习的是第21页,共71页 C+C+为每个实例对象的数据成员为每个实例对象的数据成员分配内存分配内存,而代码,而代码部分部分共享共享。Point Point setxy(int,int)displayxy()p1p1p2p23456x xy ysetxysetxydisplayxydisplayxyx xy ysetxysetxydisplayxydisplayxy对象的内存分布对象的内存分布现在学习的是第22页,共71页3.3 构造函数与析构函数构造函数与析构函数返回首页返回首页3.3.1 构造函数构造
13、函数3.3.2 析构函数析构函数3.3.3 拷贝构造函数拷贝构造函数现在学习的是第23页,共71页3.3.1 构造函数构造函数基本类型变量的初始化:基本类型变量的初始化:int a=6;int a=6;int b(8);int b(8);提出问题:提出问题:类类型的对象是否也可以类类型的对象是否也可以在定义时初始化在定义时初始化?现在学习的是第24页,共71页3.3.1 构造函数构造函数1.1.构造函数的特点构造函数的特点 构造函数是一种特殊的成员函数,对象的创建构造函数是一种特殊的成员函数,对象的创建和初始化工作可以由它来完成,其格式如下:和初始化工作可以由它来完成,其格式如下:()函数体函
14、数体 函数名与类名相同不能有返回类型可以重载创建对象时被自动调用现在学习的是第25页,共71页3.3.1 构造函数构造函数2.默认构造函数默认构造函数 当没有为一个类定义任何构造函数的情况下,编译当没有为一个类定义任何构造函数的情况下,编译系统就会自动生成一个系统就会自动生成一个无参数无参数、空函数体空函数体的的默认构造默认构造函数函数。其格式如下:。其格式如下:()()现在学习的是第26页,共71页3.3.1 构造函数构造函数【例【例3.53.5】修改例】修改例3.23.2中定义的类,示例构造函数的用法。中定义的类,示例构造函数的用法。返回本节返回本节现在学习的是第27页,共71页3.3.2
15、 析构函数析构函数1.析构函数的特点析构函数的特点 析构函数也是一种特殊的成员函数,它的作用是在析构函数也是一种特殊的成员函数,它的作用是在对象消失时执行一些清理任务对象消失时执行一些清理任务。其格式如下:。其格式如下:()函数体函数体 函数为“类名”不能有返回类型不可以重载撤消对象时被自动调用,也可显式调用现在学习的是第28页,共71页3.3.2 析构函数析构函数2默认析构函数默认析构函数 如果一个类中没有定义析构函数时,系统将如果一个类中没有定义析构函数时,系统将自动生成一个自动生成一个默认析构函数默认析构函数,其格式如下:,其格式如下::()()现在学习的是第29页,共71页3.3.2
16、析构函数析构函数【例【例3.6】修改例】修改例3.2中定义的类,示例析构函数的用法。中定义的类,示例析构函数的用法。返回本节返回本节现在学习的是第30页,共71页3.3.3 拷贝构造函数拷贝构造函数1.拷贝构造函数的特点拷贝构造函数的特点 拷贝构造函数拷贝构造函数是一种特殊的构造函数,它的作用是是一种特殊的构造函数,它的作用是用用一个已经存在的对象去初始化另一个对象一个已经存在的对象去初始化另一个对象。其格式为:。其格式为:(const&)函数体函数体 保证源对象不被改变对象的引用,不创建对象现在学习的是第31页,共71页3.3.3 拷贝构造函数拷贝构造函数在以下在以下3种情况下会自动调用拷贝
17、构造函数:种情况下会自动调用拷贝构造函数:当用类的当用类的一个对象去初始化一个对象去初始化该类的该类的另一个对象另一个对象时时 当函数的当函数的形参是类的对象形参是类的对象,进行形参和实参结合时,进行形参和实参结合时 当函数的当函数的返回值是类的对象返回值是类的对象,函数执行完成返回调用,函数执行完成返回调用者时者时现在学习的是第32页,共71页3.3.3 拷贝构造函数拷贝构造函数 2默认拷贝构造函数默认拷贝构造函数 如果一个类中没有定义拷贝构造函数,则系统自动如果一个类中没有定义拷贝构造函数,则系统自动生成一个生成一个默认拷贝构造函数默认拷贝构造函数。该函数的功能是将已知对象的所有数据成员的
18、值拷贝该函数的功能是将已知对象的所有数据成员的值拷贝给对应的对象的所有数据成员。给对应的对象的所有数据成员。如如Point类默认的拷贝构造函数类默认的拷贝构造函数相当于相当于:Point(const Point&p)X=p.X;Y=p.Y;现在学习的是第33页,共71页3.3.3 拷贝构造函数拷贝构造函数【例【例3.7】分析下面程序的执行过程,了解拷贝构造函数的用】分析下面程序的执行过程,了解拷贝构造函数的用法。法。返回本节返回本节现在学习的是第34页,共71页3.4 this指针指针 Point Point setxy(int,int)displayxy()p1p1p2p23456x xy
19、ysetxysetxydisplayxydisplayxyx xy ysetxysetxydisplayxydisplayxyvoid Point:displayxy()cout(X,Y)endl;p1.displayxy();p2.displayxy();输出p1的X、Y,而不是p2的X、Y?现在学习的是第35页,共71页3.4 this指针指针 C+C+为成员函数提供的一个称为为成员函数提供的一个称为thisthis的指针。的指针。thisthis指针将作为一个变元指针将作为一个变元自动传给被调用的函数自动传给被调用的函数。当某一对象调用一个成员函数时,当某一对象调用一个成员函数时,thi
20、sthis指针就指向该对象指针就指向该对象。所以,不同的对象调用同一个成员函数时,编译器根据所以,不同的对象调用同一个成员函数时,编译器根据thisthis指针来确定指针来确定应该引用哪一个对象的数据成员。应该引用哪一个对象的数据成员。void Point:displayxy()cout(X,Y)endl;p1.displayxy();/thisthis指针指向指针指向p1p1p2.displayxy();/thisthis指针指向指针指向p2p2p1.p1.p2.p2.现在学习的是第36页,共71页3.4 this指针指针 thisthis指针的特点:指针的特点:uthisthis指针是由指
21、针是由C+C+编译器自动产生且较常用的一个编译器自动产生且较常用的一个隐含对隐含对象指针象指针,它不能被显式声明。,它不能被显式声明。u this this指针是一个指针是一个局部量局部量,局部于某个对象。,局部于某个对象。u this this指针是一个指针是一个常量常量,它不能作为赋值、递增、递减等,它不能作为赋值、递增、递减等运算的目标对象。运算的目标对象。u 只有只有非静态类成员函数非静态类成员函数才拥有才拥有thisthis指针,并通过该指指针,并通过该指针来处理对象。针来处理对象。现在学习的是第37页,共71页3.4 this指针指针【例【例3.83.8】分析下面程序,体会】分析下
22、面程序,体会thisthis指针的隐式使用指针的隐式使用现在学习的是第38页,共71页3.4 this指针指针【例【例3.9】分析程序结果,体会】分析程序结果,体会this指针的显式使用。指针的显式使用。返回首页返回首页现在学习的是第39页,共71页3.5 子对象和堆对象子对象和堆对象 返回首页返回首页3.5.1 子对象子对象3.5.2 堆对象堆对象现在学习的是第40页,共71页3.5.1 子对象子对象 一个对象作为另一个类的数据成员时,该对象称为一个对象作为另一个类的数据成员时,该对象称为类的类的子对象或对象成员子对象或对象成员。说明形式为:。说明形式为:class ;现在学习的是第41页,
23、共71页3.5.1 子对象子对象class A ;class B private:A a;例如:例如:现在学习的是第42页,共71页3.5.1 子对象子对象2.子对象的子对象的初始化初始化设设X X类含有子对象类含有子对象 为初始化子对象,为初始化子对象,X X类的构造函数要调用这些对类的构造函数要调用这些对象成员所在类的构造函数,于是象成员所在类的构造函数,于是X X类的构造函数中就类的构造函数中就应包含数据成员应包含数据成员初始化列表初始化列表,用来给子对象进行初始,用来给子对象进行初始化。化。现在学习的是第43页,共71页3.5.1 子对象子对象X X类的构造函数的定义形式如下:类的构造
24、函数的定义形式如下::():(),(),,()现在学习的是第44页,共71页3.5.1 子对象子对象 对子对象的构造函数的对子对象的构造函数的调用顺序取决于这些调用顺序取决于这些子对象在类中说明的顺序子对象在类中说明的顺序,与它们在成员初始化,与它们在成员初始化列表中给出的顺序无关。列表中给出的顺序无关。当建立当建立X类的对象时,类的对象时,先先调用子对象的构造函调用子对象的构造函数,数,初始化子对象初始化子对象,然后然后才执行才执行X类的构造函数,类的构造函数,初初始化始化X类中的其他成员类中的其他成员。现在学习的是第45页,共71页3.5.1 子对象子对象【例【例3.10】分析下面程序中构
25、造函数与析构函数的调用顺】分析下面程序中构造函数与析构函数的调用顺序。序。现在学习的是第46页,共71页3.5.2 堆对象堆对象堆对象堆对象:是在程序运行时根据需要随时可以被创建或删:是在程序运行时根据需要随时可以被创建或删除的对象。除的对象。C+程序的内存格局通常分为程序的内存格局通常分为4个区:个区:数据区数据区 代码区代码区 栈区栈区 堆区堆区(即自由存储区即自由存储区)现在学习的是第47页,共71页3.5.2 堆对象堆对象1.使用使用运算符运算符new创建堆对象创建堆对象 使用使用new运算符可以动态地创建对象,即堆对象。运算符可以动态地创建对象,即堆对象。使用语法为:使用语法为:ne
26、w ()例如:例如:HeapClass*pa;Pa=new HeapClass(3,7);此时调用HeapClass类的构造函数现在学习的是第48页,共71页3.5.2 堆对象堆对象2.使用使用运算符运算符delete删除堆对象删除堆对象 该运算符专门用来释放由运算符该运算符专门用来释放由运算符new所创建所创建的对象。的对象。其使用语法为:其使用语法为:delete 例如:例如:delete pa;现在学习的是第49页,共71页3.5.2 堆对象堆对象【例【例3.11】分析下列程序的输出结果,注意运算符】分析下列程序的输出结果,注意运算符new和和delete的用法。的用法。现在学习的是第5
27、0页,共71页3.5.2 堆对象堆对象3.使用使用运算符运算符new 创建对象数组创建对象数组其使用语法为:其使用语法为:new 其中,其中,给出数组的大小;后面不能再跟构造给出数组的大小;后面不能再跟构造函数参数,函数参数,只能调用默认的构造函数只能调用默认的构造函数。例如:例如:HeapArrayClass*ptr;ptr=new HeapArrayClass 15;现在学习的是第51页,共71页3.5.2 堆对象堆对象4.使用运算符使用运算符delete 删除对象数组删除对象数组其格式如下:其格式如下:delete 现在学习的是第52页,共71页3.5.2 堆对象堆对象【例【例3.12】
28、分析下列程序的输出结果,注意运算符】分析下列程序的输出结果,注意运算符new 和和delete 的用法。的用法。现在学习的是第53页,共71页3.6 类的静态成员类的静态成员 返回首页返回首页3.6.1 静态数据成员静态数据成员3.6.2 静态成员函数静态成员函数现在学习的是第54页,共71页3.6.1 静态数据成员静态数据成员静态成员是指声明为静态成员是指声明为staticstatic的类成员;的类成员;静态成员包括静态成员包括静态数据成员静态数据成员和和静态成员函数静态成员函数。静态数据成员不属于任何对象,它是类定义的一部分,静态数据成员不属于任何对象,它是类定义的一部分,类的类的所有对象
29、共享静态数据成员所有对象共享静态数据成员。静态数据成员静态数据成员在程序开始运行时创建在程序开始运行时创建而不是在对象创建时创而不是在对象创建时创建。建。静态数据成员所占空间的回收也不是在析构函数时进行而是静态数据成员所占空间的回收也不是在析构函数时进行而是在程序结束时在程序结束时进行。进行。现在学习的是第55页,共71页3.6.1 静态数据成员静态数据成员1.静态数据成员的静态数据成员的初始化初始化 必须对静态数据成员进行初始化,因为只有这时编译程序才必须对静态数据成员进行初始化,因为只有这时编译程序才会为静态数据成员分配一个具体的作储空间。会为静态数据成员分配一个具体的作储空间。静态数据成
30、员的初始化与一般数据成员不同,它的初始静态数据成员的初始化与一般数据成员不同,它的初始化不能在构造函数中进行。化不能在构造函数中进行。静态数据成员初始化的格式为:静态数据成员初始化的格式为::=;现在学习的是第56页,共71页3.6.1 静态数据成员静态数据成员2.静态数据成员的静态数据成员的引用引用 静态数据成员可说明为公有的、私有的、或保护静态数据成员可说明为公有的、私有的、或保护的。若为公有的可直接访问,引用静态数据成员的格的。若为公有的可直接访问,引用静态数据成员的格式为:式为::现在学习的是第57页,共71页3.6.1 静态数据成员静态数据成员【例【例3.13】用静态数据成员的控制点
31、类,每次只允许一】用静态数据成员的控制点类,每次只允许一个对象访问。个对象访问。现在学习的是第58页,共71页3.6.1 静态数据成员静态数据成员【例【例3.14】统计点类的对象数,示例静态数据成员的记】统计点类的对象数,示例静态数据成员的记数作用。数作用。返回本节返回本节现在学习的是第59页,共71页3.6.2 静态成员函数静态成员函数 静态成员函数静态成员函数的定义和其他成员函数一样。在的定义和其他成员函数一样。在一般函数定义前加上一般函数定义前加上static关键字。关键字。调用静态成员函数的格式为:调用静态成员函数的格式为::();或或 .();现在学习的是第60页,共71页3.6.2
32、 静态成员函数静态成员函数【例【例3.15】改写例】改写例3.14,用静态成员函数输出点类的对,用静态成员函数输出点类的对象数。象数。静态成员函数中可以访问非静态数据成员吗?静态成员函数中可以访问非静态数据成员吗?现在学习的是第61页,共71页3.6.2 静态成员函数静态成员函数【例【例3.16】用静态成员函数输出点的位置。】用静态成员函数输出点的位置。返回本节返回本节现在学习的是第62页,共71页3.7 类的友元类的友元返回首页返回首页3.7.1 友元函数友元函数3.7.2 友元类友元类现在学习的是第63页,共71页3.7.1 友元函数友元函数 引例;求两点距离引例;求两点距离现在学习的是第
33、64页,共71页3.7.1 友元函数友元函数 在类里声明一个在类里声明一个普通函数普通函数,加上关键字,加上关键字friendfriend,就,就成了该类的成了该类的友元函数友元函数,它,它可以访问该类的一切成员可以访问该类的一切成员。其。其原型为:原型为:friend friend ();友元函数声明的位置可在类的任何部位,既可在友元函数声明的位置可在类的任何部位,既可在pubicpubic区,也可在区,也可在protectedprotected区。其实现放在类的外部。区。其实现放在类的外部。现在学习的是第65页,共71页3.7.1 友元函数友元函数【例【例3.173.17】用友元函数求两点
34、的距离。】用友元函数求两点的距离。返回本节返回本节现在学习的是第66页,共71页3.7.2 友元类友元类 一个类可被声明为另一个一个类可被声明为另一个类的友元类的友元,该类被称为,该类被称为友元类友元类。假设有类假设有类A和类和类B,若在类,若在类B的定义中将类的定义中将类A声明为友声明为友元,那么,类元,那么,类A被称作类被称作类B的友元类,它所有的成员函数都的友元类,它所有的成员函数都可以访问类可以访问类B中的任意成员。中的任意成员。友元类的声明为:友元类的声明为:friend ;现在学习的是第67页,共71页3.7.2 友元类友元类【例【例3.18】示例友元类的使用】示例友元类的使用返回
35、本节返回本节友元是否会破坏类的封装性?友元是否会破坏类的封装性?现在学习的是第68页,共71页结论(友元的意义):结论(友元的意义):友元是对类的友元是对类的封装机制封装机制的的补充补充。利用友元,一个类可以赋予某函数。利用友元,一个类可以赋予某函数访问它的私有成员的特权,这个函数可以直接访问该类的私有数据,访问它的私有成员的特权,这个函数可以直接访问该类的私有数据,从而提高程序的运行效率。从而提高程序的运行效率。引入友元机制并不是使类的私有数据成为公有的或全局的,未经引入友元机制并不是使类的私有数据成为公有的或全局的,未经授权的其他函数仍然不能直接访问这些私有数据,因此慎重、合授权的其他函数
36、仍然不能直接访问这些私有数据,因此慎重、合理地使用理地使用友元机制不会彻底丧失数据安全性友元机制不会彻底丧失数据安全性。友元提供了不同类的成员函数之间、类的成员函数与一般函数之友元提供了不同类的成员函数之间、类的成员函数与一般函数之间进行间进行数据共享数据共享的机制。的机制。现在学习的是第69页,共71页3.8 应用实例应用实例 返回首页返回首页班级类数据成员:Student*stustatic int countstatic float sum成员函数:构造函数析构函数输入成绩求平均分输出成绩Student数据成员:namenumscore现在学习的是第70页,共71页3.8 应用实例应用实例 返回首页返回首页现在学习的是第71页,共71页