ImageVerifierCode 换一换
格式:PPT , 页数:49 ,大小:1.18MB ,
文档编号:5787133      下载积分:15 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-5787133.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(momomo)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

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

《c++程序设计》课件第6章 面向对象的妥协 (2).ppt

1、C+程序设计第第6 6章章 面向对象的妥协面向对象的妥协本章学习要点本章学习要点友元友元友元函数友元类静态成员静态成员静态数据成员静态成员函数静态成员函数第第6章章 面向对象的妥协面向对象的妥协本章学习目标本章学习目标了解友元函数的概念,掌握友元函数的定义与使用了解友元类的概念掌握静态数据成员的定义与使用掌握静态成员函数的定义与使用第第6章章 面向对象的妥协面向对象的妥协v友元可以访问与其有好友关系的类中的任友元可以访问与其有好友关系的类中的任何成员。何成员。6.1 封装的破坏封装的破坏友元友元 友元友元友元函数友元函数友元类友元类v如果在本类以外的其他地方定义了一个函数如果在本类以外的其他地

2、方定义了一个函数(这个这个函数可以是不属于任何类的普通函数,也可以是函数可以是不属于任何类的普通函数,也可以是其他类的成员函数其他类的成员函数),在类体中用在类体中用friend对其进行对其进行声明声明,此函数就称为此函数就称为本类的友元函数本类的友元函数。友元函数。友元函数可以访问这个类中的任何成员。可以访问这个类中的任何成员。v如何将普通函数声明为友元函数呢?看下面这个如何将普通函数声明为友元函数呢?看下面这个简单的例子:简单的例子:6.1 封装的破坏封装的破坏友元友元 6.1.1 友元友元函数函数【例例6-1】友元普通函数。友元普通函数。#include using namespace

3、std;class Clock /声明声明Clock类类 public:Clock(int,int,int);friend void display(Clock&);private:int hour;int minute;int second;6.1.1 友元友元 函数函数Clock:Clock(int h,int m,int s)/构造函数构造函数 hour=h;minute=m;second=s;void display(Clock&t)coutt.hour:t.minute:t.secondendl;int main()Clock t(10,13,56);display(t);/调用di

4、splay函数,实参t是Clock类对象 return 0;6.1 友元函数友元函数程序运行结果如下:程序运行结果如下:10:13:5610:13:56这是友元函数,这是友元函数,形参形参t是是Clock类类对象的引用对象的引用【例例6-2】友元成员函数。友元成员函数。#include using namespace std;class Date;class Clock /声明声明Clock类类public:Clock(int,int,int);void display(Date&);private:int hour,minute,second;6.1.1 友元友元 函数函数Clock类的类的

5、成员函数成员函数对对Date类的提类的提前引用声明前引用声明class Date /声明声明Date类类public:Date(int,int,int);friend void Clock:display(Date&);private:int month;int day;int year;6.1.1 友元友元 函数函数Date类的类的友元函数友元函数Clock:Clock(int h,int m,int s)/Clock类的构造函数类的构造函数 hour=h;minute=m;second=s;void Clock:display(Date&dd)coutdd.month/dd.day/dd.

6、yearendl;couthour:minute:secondendl;Date:Date(int m,int d,int y)/Date类的构造函数类的构造函数 month=m;day=d;year=y;6.1.1 友元函数友元函数int main()Clock t(10,13,56);/定义Clock类对象t Date d(12,25,2004);/定义Date类对象d /调用t的display函数,实参是Date类对象d t.display(d);return 0;6.1 友元函数友元函数程序运行结果如下:程序运行结果如下:12/25/200412/25/200410:13:5610:1

7、3:56v不仅可以将一个函数声明为一个类的不仅可以将一个函数声明为一个类的“朋友朋友”,而且可以而且可以将一个类将一个类(例如例如B类类)声明为另一个类声明为另一个类(例例如如A类类)的的“朋友朋友”。这时。这时B类就是类就是A类的类的友元类友元类。友元类友元类B中的所有成员函数都是中的所有成员函数都是A类的友元函数,类的友元函数,可以访问可以访问A类中的任何成员。类中的任何成员。6.1 封装的破坏封装的破坏友元友元 6.1.2 友元友元类类class Student;class Teacherpublic:void assigngrades(Student&s);/给出学生成绩 protec

8、ted:int stu_count;/学生人数 Student*plist100;/学生数组;6.1.2 友元类友元类class Studentpublic:friend Teacher;/友元类友元类 protected:int num;string name;float score;v声明友元类的一般形式为:声明友元类的一般形式为:friend 类名类名;6.1.2 友元类友元类v关于友元,有三点需要关于友元,有三点需要说明说明:v(1)友元函数的声明可以出现在类的任何友元函数的声明可以出现在类的任何地方地方(包括在(包括在private和和public部分),也部分),也就是说友元的说明

9、不受成员访问控制符的就是说友元的说明不受成员访问控制符的限制。限制。6.1.2 友元类友元类v(2)友元关系是单向的而不是双向的友元关系是单向的而不是双向的,如,如果声明了果声明了B类是类是A类的友元类,不等于类的友元类,不等于A类类是是B类的友元类,类的友元类,A类中的成员函数不一定类中的成员函数不一定能够访问能够访问B类中的成员类中的成员v(3)友元关系是不能传递的友元关系是不能传递的,例如,如果,例如,如果B类是类是A类的友元类,类的友元类,C类是类是B类的友元类,类的友元类,并不能说并不能说C类就是类就是A类的友元类。类的友元类。v在在C+中,声明了一个类之后,可以定义该类中,声明了一

10、个类之后,可以定义该类的多个对象。系统为每个对象分配单独的内存的多个对象。系统为每个对象分配单独的内存空间。每一个对象都分别有自己的数据成员,空间。每一个对象都分别有自己的数据成员,不同对象的数据成员各自有其值,互不相干。不同对象的数据成员各自有其值,互不相干。但是有时我们希望有某一个或几个数据成员为但是有时我们希望有某一个或几个数据成员为所有对象所共有。这样可以所有对象所共有。这样可以实现数据共享实现数据共享。6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 v我们知道我们知道全局变量能够实现数据共享全局变量能够实现数据共享。但是用全。但是用全局变量的安全性得不到保证,因为在各处都可以

11、局变量的安全性得不到保证,因为在各处都可以自由地修改全局变量的值,很有可能由于某个没自由地修改全局变量的值,很有可能由于某个没注意到的失误,全局变量的值就被修改,导致程注意到的失误,全局变量的值就被修改,导致程序的失败。因此在实际工作中很少使用全局变量。序的失败。因此在实际工作中很少使用全局变量。v如果想在同类的多个对象之间如果想在同类的多个对象之间实现数据共享实现数据共享,也也不要用全局对象,可以用不要用全局对象,可以用静态成员静态成员。静态成员包。静态成员包括静态数据成员和静态成员函数。括静态数据成员和静态成员函数。6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 v静态数据成员是一

12、种特殊的数据成员静态数据成员是一种特殊的数据成员。它以关键字。它以关键字static开头。例如开头。例如:6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 6.2.1 静态数据成员静态数据成员class Studentpublic:Student(char*name=no name);static int stu_count;char name40;v静态数据成员在内存中只占一份空间静态数据成员在内存中只占一份空间(而不是每个(而不是每个对象都分别为它保留一份空间),对象都分别为它保留一份空间),它是属于类的它是属于类的,但它被该类的所有对象所共享但它被该类的所有对象所共享,每个对象都可

13、以访,每个对象都可以访问这个静态数据成员。问这个静态数据成员。静态数据成员的值对所有对静态数据成员的值对所有对象都是一样的。象都是一样的。如果改变它的值,则在各对象中这如果改变它的值,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间,个数据成员的值都同时改变了。这样可以节约空间,提高效率。提高效率。6.2.1 静态数据成员静态数据成员 v(1)如果只声明了类而未定义对象,则类的一般数据)如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。但是的数据成员分配空间。但是静态数据成员不

14、属于某一个静态数据成员不属于某一个对象,对象,在为对象所分配的空间中不包括静态数据成员所在为对象所分配的空间中不包括静态数据成员所占的空间占的空间。静态数据成员是在所有对象之外单独开辟空静态数据成员是在所有对象之外单独开辟空间间。只要在类中定义了静态数据成员,即使不定义对象,只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被访问也为静态数据成员分配空间,它可以被访问。在一个类。在一个类中可以有一个或多个静态数据成员,所有的对象共享这中可以有一个或多个静态数据成员,所有的对象共享这些静态数据成员,都可以访问它。些静态数据成员,都可以访问它。6.2.1 静态数据成员静

15、态数据成员 说明:说明:v(2)静态数据成员不随对象的建立而分配空间,也静态数据成员不随对象的建立而分配空间,也不随对象的撤销而释放不随对象的撤销而释放(一般数据成员是在对象建立一般数据成员是在对象建立时分配空间,在对象撤销时释放时分配空间,在对象撤销时释放)。静态数据成员是。静态数据成员是在程序编译时被分配空间的,到程序结束时才释放在程序编译时被分配空间的,到程序结束时才释放空间。空间。6.2.1 静态数据成员静态数据成员 v(3)静态数据成员可以初始化,但只能在类体外进静态数据成员可以初始化,但只能在类体外进行初始化行初始化。如:。如:int Student:stu_count=0;v静态

16、数据成员可以初始化语句的一般形式为:静态数据成员可以初始化语句的一般形式为:数据类型数据类型 类名类名:静态数据成员名静态数据成员名=初值初值;v不必在初始化语句中加不必在初始化语句中加static。6.2.1 静态数据成员静态数据成员 v(4)静态数据成员既可以静态数据成员既可以通过对象名访问通过对象名访问,也可以,也可以通过类名来访问通过类名来访问。6.2.1 静态数据成员静态数据成员【例【例6-36-3】访问静态数据成员。访问静态数据成员。#include using namespace std;#include class Studentpublic:Student(char*name

17、=no name);Student();static int stu_count;char name40;6.2.1 静态数据成员静态数据成员 Student:Student(char*pname)strcpy(name,pname);stu_count+;/每创建一个对象,学生人数加每创建一个对象,学生人数加1Student:Student()stu_count-;/每释放一个对象,学生人数减每释放一个对象,学生人数减1/对静态数据成员对静态数据成员stu_count初始化初始化 int Student:stu_count=0;6.2.1 静态数据成员静态数据成员 int main()Stu

18、dent s1;couts1.stu_countendl;Student s2;couts2.stu_count endl;coutStudent:stu_count endl;return 0;程序运行结果如下:程序运行结果如下:1 12 21 16.2.1 静态数据成员静态数据成员 v与静态数据成员不同,与静态数据成员不同,静态成员函数的作用静态成员函数的作用不是为不是为了对象之间的沟通,而是为了能处理静态数据成员了对象之间的沟通,而是为了能处理静态数据成员。6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 6.2.2 静态成员静态成员函数函数【例【例6-6-4 4】静态成员静态成员

19、函数访问静态数据成员的例子。函数访问静态数据成员的例子。#include using namespace std;#include class Student/声明声明Student类类public:Student(char*name=no name);Student();static int getcount()return stu_count;private:static int stu_count;char name40;6.2.2 静态成员函数静态成员函数 Student:Student(char*pname)strcpy(name,pname);stu_count+;/每创建一个对象

20、,学生人数加每创建一个对象,学生人数加1Student:Student()stu_count-;/每销毁一个对象,学生人数减每销毁一个对象,学生人数减1int Student:stu_count=0;6.2.2 静态成员函数静态成员函数 int main()Student s1;couts1.getcount()endl;Student s2;couts2.getcount()endl;coutStudent:getcount()endl;return 0;6.2.2 静态成员函数静态成员函数 6.2.2 静态成员函数静态成员函数 v和静态数据成员一样,和静态数据成员一样,静态成员函数是类的一

21、部分静态成员函数是类的一部分,而不是对象的一部分而不是对象的一部分。如果要在类外调用公用的静。如果要在类外调用公用的静态成员函数,可以用类名和域运算符态成员函数,可以用类名和域运算符“:”,也允许通,也允许通过对象名调用静态成员函数。如:过对象名调用静态成员函数。如:vStudent:getcount();/用类名调用静态成员函数用类名调用静态成员函数vs1.getcount();/用对象名调用静态成员函数用对象名调用静态成员函数v但这并不意味着此函数是属于对象但这并不意味着此函数是属于对象s1的,而只是用的,而只是用s1的类型而已。的类型而已。6.2.2 静态成员函数静态成员函数(1)静态成

22、员函数不能默认访问本类中的非静态成员静态成员函数不能默认访问本类中的非静态成员。当调用当调用一个对象的成员函数(非静态成员函数)时,系统会把该对一个对象的成员函数(非静态成员函数)时,系统会把该对象的起始地址赋给成员函数的象的起始地址赋给成员函数的this指针。而静态成员函数并不指针。而静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没属于某一对象,它与任何对象都无关,因此静态成员函数没有有this指针。既然它没有指向某一对象,就无法对一个对象中指针。既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问的非静态成员进行默认访问(即在访问数据成员时不指定对象即在访

23、问数据成员时不指定对象名名)。v 可以说,可以说,静态成员函数与非静态成员函数的根本区别静态成员函数与非静态成员函数的根本区别是:是:非非静态成员函数有静态成员函数有this指针,而静态成员函数没有指针,而静态成员函数没有this指针指针,因因而决定了静态成员函数不能默认访问本类中的非静态成员。而决定了静态成员函数不能默认访问本类中的非静态成员。说明:说明:6.2.2 静态成员函数静态成员函数 v(2)静态成员函数可以直接访问本类中的静态数据成员,静态成员函数可以直接访问本类中的静态数据成员,因因为静态成员同样是属于类的,可以直接访问。在为静态成员同样是属于类的,可以直接访问。在C+程序中,程

24、序中,静态成员函数主要用来访问静态数据成员,而不访问非静态静态成员函数主要用来访问静态数据成员,而不访问非静态成员。成员。假如在一个静态成员函数中有以下语句假如在一个静态成员函数中有以下语句:v coutageendl;/若若age已声明为已声明为static,则访问本类中的,则访问本类中的静态成员,合法静态成员,合法v coutscoreendl;/若若score是非静态数据成员,不合法是非静态数据成员,不合法说明:说明:6.2.2 静态成员函数静态成员函数 v但是,并不是绝对不能访问本类中的非静态成员,只但是,并不是绝对不能访问本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找

25、哪个对是不能进行默认访问,因为无法知道应该去找哪个对象。象。如果一定要访问本类的非静态成员,应该加对象如果一定要访问本类的非静态成员,应该加对象名和成员运算符名和成员运算符“.”。如静态成员函数中可以出现:。如静态成员函数中可以出现:vcouts.scoreendl;v这里假设这里假设s已定义为已定义为Student类对象,且在当前作用类对象,且在当前作用域内有效,则此语句合法。域内有效,则此语句合法。说明:说明:#include using namespace std;class Studentpublic:Student(int,int,int);void total();static f

26、loat average();private:int num;int age;float score;static float sum;static int count;Student:Student (int m,int a,int s)num=m;age=a;score=s;void Student:total()sum+=score;count+;float Student:average()return(sum/count);float Student:sum=0;int Student:count=0;静态成员函数的应用静态成员函数的应用int main()Student stud3

27、=Student(1001,18,70),Student(1002,19,79),Student(1005,20,98);int n;coutn;for(int i=0;in;i+)studi.total();coutThe average score of n;cout students is Student:average()endl;return 0;stud0.average()6.2.2 静态成员函数静态成员函数 v如果想在如果想在average()函数中引用函数中引用stud1中的非静态数中的非静态数据成员据成员score,应该怎样做?,应该怎样做?float Student:av

28、erage()coutstud1.scoreendl;return(sum/count);float Student:average(Student stu)coutstu.scoreendl;return(sum/count);6.2.2 静态成员函数静态成员函数 float Student:average(Student stu)float Student:average(Student&stu)float Student:average(const Student stu)float Student:average(const Student&stu)v但是在但是在C+程序中最好养成这样

29、的习惯:程序中最好养成这样的习惯:只用静态只用静态成员函数访问静态数据成员,而不访问非静态数据成员函数访问静态数据成员,而不访问非静态数据成员。这样思路清晰,逻辑清楚,不易出错。成员。这样思路清晰,逻辑清楚,不易出错。v1、下面关于友元的描述中,错误的是(、下面关于友元的描述中,错误的是()。)。vA 友元函数可以访问该类的私有数据成员。友元函数可以访问该类的私有数据成员。vB 一个类的友元类中的成员函数都是这个类一个类的友元类中的成员函数都是这个类的友元函数。的友元函数。vC 友元可以提高程序的运行效率。友元可以提高程序的运行效率。vD 类与类之间的友元关系可以继承。类与类之间的友元关系可以

30、继承。Dv2、友元访问类的对象的成员时使用(、友元访问类的对象的成员时使用()A 类的成员名类的成员名 B this指针指向成员名指针指向成员名 C“类名类名:成员名成员名”的形式的形式 D“对象名对象名.成员名成员名”的形式的形式Dv3、已知类、已知类A是类的友元,类是类的友元,类B是类是类C的友元,的友元,则(则()。)。A 类类A一定是类一定是类C的友元的友元 B 类类C一定是类一定是类A的友元的友元 C 类类C的成员函数可以访问类的成员函数可以访问类B的对象的任何的对象的任何成员成员 D 类类A的成员函数可以访问类的成员函数可以访问类B的对象的任何的对象的任何成员成员Dv4、下面对静态

31、数据成员的描述中,正确的是、下面对静态数据成员的描述中,正确的是()。)。vA 静态数据成员是类的所有对象共享的数据静态数据成员是类的所有对象共享的数据vB 类的每个对象都有自己的静态数据成员类的每个对象都有自己的静态数据成员vC 类的不同对象有不同的静态数据成员值类的不同对象有不同的静态数据成员值vD 静态数据成员不能通过类的对象调用静态数据成员不能通过类的对象调用Av1、友元可以访问与其有好友关系的类中、友元可以访问与其有好友关系的类中的的 。友元包括。友元包括 和和 。v2、声明友元的关键字是、声明友元的关键字是 。v3、类的静态成员包括、类的静态成员包括 和和 。v4、静态数据成员是在

32、、静态数据成员是在 时被分配时被分配空间的,到空间的,到 时才释放空间。时才释放空间。任何成员friend友元函数友元类静态数据成员程序编译时静态成员函数程序结束时教材教材P178 二、编程题二、编程题 1,2,3,45.设计并测试点类设计并测试点类Point,其数据成员是直角,其数据成员是直角坐标系的点坐标,友元函数坐标系的点坐标,友元函数distance用来计用来计算两点间的距离。算两点间的距离。6设计一个书类,能够保存书名、定价,所设计一个书类,能够保存书名、定价,所有书的本数和总价。有书的本数和总价。作业答案:第作业答案:第4 4题题#include using namespace s

33、td;class Accountpublic:Account(char*Name,char*Psw);Account()number+;Account()number-;int getNumber()return number;private:char name10;char psw6;static int number;/保存对象个数保存对象个数;Account:Account(char*Name,char*Psw)strcpy(name,Name);strcpy(psw,Psw);number+;/静态成员并初始化为静态成员并初始化为0int Account:number=0;int ma

34、in()Account za(tom,123456);coutza.getNumber(),;Account a3;coutza.getNumber(),;Account x,y;coutza.getNumber(),;coutza.getNumber()endl;return 0;作业答案:第作业答案:第6 6题题#include using namespace std;class Bookprivate:char bkName20;double price;static int number;static double totalPrice;public:Book(char*,double

35、);Book();double getPrice()return price;char*getName()return bkName;static int getNumber()return number;static double getTotalPrice()return totalPrice;void display();作业答案:第作业答案:第6 6题(接上页)题(接上页)Book:Book(char*name,double Price)/构造函数,可以访问静态和非静态成员构造函数,可以访问静态和非静态成员 strcpy(bkName,name);price=Price;number+

36、;totalPrice+=price;Book:Book()number-;/析构一本书就减少书的本数析构一本书就减少书的本数 totalPrice-=price;/析构一本书就减少书的总价析构一本书就减少书的总价/此函数仅是一个验证,表示非静态成员函数可以访问静态的数据和函数成员此函数仅是一个验证,表示非静态成员函数可以访问静态的数据和函数成员void Book:display()coutbook name:bkName pirce:priceendl;coutnumber:number totalPrice:totalPriceendl;coutcall static function g

37、etNumber()endl;/初始化静态数据成员初始化静态数据成员int Book:number=0;double Book:totalPrice=0;作业答案:第作业答案:第6 6题(接上页)题(接上页)int main()Book b1(C+程序设计程序设计,32.5);Book b2(数据库系统原理数据库系统原理,23);coutb1.getName()tb1.getPrice()endl;coutb2.getName()tb2.getPrice()endl;cout总共总共:b1.getNumber()t本书本书 t总价:总价:b1.getTotalPrice()t元元endl;Book b3(数据库系统原理数据库系统原理,23);cout总共总共:b1.getNumber()t本书本书 t总价:总价:b1.getTotalPrice()t元元endl;/b3生存期结束生存期结束 cout总共总共:Book:getNumber()t本书本书 t总价:总价:Book:getTotalPrice()t元元endl;b2.display();return 0;

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

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


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