《c++程序设计》课件第6章 面向对象的妥协.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《c++程序设计》课件第6章 面向对象的妥协.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c+程序设计 c+程序设计课件第6章 面向对象的妥协 c+ 程序设计 课件 面向 对象 妥协
- 资源描述:
-
1、第6章 面向对象的妥协本章学习要点本章学习要点友元友元友元函数友元函数友元类友元类静态成员静态成员静态数据成员静态数据成员静态成员函数静态成员函数第第6章章 面向对象的妥协面向对象的妥协本章学习目标本章学习目标了解友元函数的概念,掌握友元函数的定义与使用了解友元函数的概念,掌握友元函数的定义与使用了解友元类的概念了解友元类的概念掌握静态数据成员的定义与使用掌握静态数据成员的定义与使用掌握静态成员函数的定义与使用掌握静态成员函数的定义与使用第第6章章 面向对象的妥协面向对象的妥协v友元可以访问与其有好友关系的类中的任友元可以访问与其有好友关系的类中的任何成员。何成员。6.1 封装的破坏封装的破坏
2、友元友元 友元友元友元函数友元函数友元类友元类v如果在本类以外的其他地方定义了一个函数如果在本类以外的其他地方定义了一个函数(这个这个函数可以是不属于任何类的普通函数,也可以是函数可以是不属于任何类的普通函数,也可以是其他类的成员函数其他类的成员函数),在类体中用在类体中用friend对其进行对其进行声明声明,此函数就称为此函数就称为本类的友元函数本类的友元函数。友元函数。友元函数可以访问这个类中的任何成员。可以访问这个类中的任何成员。v如何将普通函数声明为友元函数呢?看下面这个如何将普通函数声明为友元函数呢?看下面这个简单的例子:简单的例子:6.1 封装的破坏封装的破坏友元友元 6.1.1
3、友元友元函数函数【例例6-1】友元普通函数。友元普通函数。#include using namespace 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.s
4、econdendl;int main()Clock t(10,13,56);display(t);/调用调用display函数,实参函数,实参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 displ
5、ay(Date&);private:int hour,minute,second;6.1.1 友元友元 函数函数Clock类的类的成员函数成员函数对对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;min
6、ute=m;second=s;void Clock:display(Date&dd)coutdd.month/dd.day/dd.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类对象类对
7、象d t.display(d);return 0;6.1 友元函数友元函数程序运行结果如下:程序运行结果如下:12/25/200412/25/200410:13:5610:13:56v不仅可以将一个函数声明为一个类的不仅可以将一个函数声明为一个类的“朋友朋友”,而且可以而且可以将一个类将一个类(例如例如B类类)声明为另一个类声明为另一个类(例例如如A类类)的的“朋友朋友”。这时。这时B类就是类就是A类的类的友元类友元类。友元类友元类B中的所有成员函数都是中的所有成员函数都是A类的友元函数,类的友元函数,可以访问可以访问A类中的任何成员。类中的任何成员。6.1 封装的破坏封装的破坏友元友元 6.
8、1.2 友元友元类类class Student;class Teacherpublic:void assigngrades(Student&s);/给出学生成绩给出学生成绩 protected:int stu_count;/学生人数学生人数 Student*plist100;/学生数组学生数组;6.1.2 友元类友元类class Studentpublic:friend Teacher;/友元类友元类 protected:int num;string name;float score;v声明友元类的一般形式为:声明友元类的一般形式为:friend 类名类名;14友元类举例友元类举例class
9、A friend class B;/B是是A的友元类的友元类 public:void Display()coutxendl;private:int x;class B public:void Set(int i);void Display();private:A a;15void B:Set(int i)a.x=i;void B:Display()a.Display();39友元类举例友元类举例6.1.2 友元类友元类v关于友元,有三点需要关于友元,有三点需要说明说明:v(1)友元函数的声明可以出现在类的任何友元函数的声明可以出现在类的任何地方地方(包括在(包括在private和和public
10、部分),也就部分),也就是说友元的说明不受成员访问控制符的限是说友元的说明不受成员访问控制符的限制。制。6.1.2 友元类友元类v(2)友元关系是单向的而不是双向的友元关系是单向的而不是双向的,如,如果声明了果声明了B类是类是A类的友元类,不等于类的友元类,不等于A类是类是B类的友元类,类的友元类,A类中的成员函数不一定能类中的成员函数不一定能够访问够访问B类中的成员类中的成员v(3)友元关系是不能传递的友元关系是不能传递的,例如,如果,例如,如果B类是类是A类的友元类,类的友元类,C类是类是B类的友元类,并类的友元类,并不能说不能说C类就是类就是A类的友元类。类的友元类。v在在C+中,声明了
11、一个类之后,可以定义该类中,声明了一个类之后,可以定义该类的多个对象。系统为每个对象分配单独的内存的多个对象。系统为每个对象分配单独的内存空间。每一个对象都分别有自己的数据成员,空间。每一个对象都分别有自己的数据成员,不同对象的数据成员各自有其值,互不相干。不同对象的数据成员各自有其值,互不相干。但是有时我们希望有某一个或几个数据成员为但是有时我们希望有某一个或几个数据成员为所有对象所共有。这样可以所有对象所共有。这样可以实现数据共享实现数据共享。6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 v我们知道我们知道全局变量能够实现数据共享全局变量能够实现数据共享。但是用全局。但是用全局变
12、量的安全性得不到保证,因为在各处都可以自由变量的安全性得不到保证,因为在各处都可以自由地修改全局变量的值,很有可能由于某个没注意到地修改全局变量的值,很有可能由于某个没注意到的失误,全局变量的值就被修改,导致程序的失败的失误,全局变量的值就被修改,导致程序的失败。因此在实际工作中很少使用全局变量。因此在实际工作中很少使用全局变量。v如果想在同类的多个对象之间如果想在同类的多个对象之间实现数据共享实现数据共享,也不也不要用全局对象,可以用要用全局对象,可以用静态成员静态成员。静态成员包括静。静态成员包括静态数据成员和静态成员函数。态数据成员和静态成员函数。6.2 对象机制的破坏对象机制的破坏 静
13、态成员静态成员 v静态数据成员是一种特殊的数据成员静态数据成员是一种特殊的数据成员。它以关键字。它以关键字static开头。例如开头。例如:6.2 对象机制的破坏对象机制的破坏 静态成员静态成员 6.2.1 静态数据成员静态数据成员class Studentpublic:Student(char*name=no name);static int stu_count;char name40;v静态数据成员在内存中只占一份空间静态数据成员在内存中只占一份空间(而不是每个(而不是每个对象都分别为它保留一份空间),对象都分别为它保留一份空间),它是属于类的它是属于类的,但它被该类的所有对象所共享但它被
14、该类的所有对象所共享,每个对象都可以访,每个对象都可以访问这个静态数据成员。问这个静态数据成员。静态数据成员的值对所有对静态数据成员的值对所有对象都是一样的。象都是一样的。如果改变它的值,则在各对象中这如果改变它的值,则在各对象中这个数据成员的值都同时改变了。这样可以节约空间个数据成员的值都同时改变了。这样可以节约空间,提高效率。,提高效率。6.2.1 静态数据成员静态数据成员 v(1)如果只声明了类而未定义对象,则类的一般数据)如果只声明了类而未定义对象,则类的一般数据成员是不占内存空间的,只有在定义对象时,才为对象成员是不占内存空间的,只有在定义对象时,才为对象的数据成员分配空间。但是的数
展开阅读全文