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