《类隐藏实现》PPT课件

上传人:hao****021 文档编号:252942683 上传时间:2024-11-26 格式:PPT 页数:34 大小:240KB
返回 下载 相关 举报
《类隐藏实现》PPT课件_第1页
第1页 / 共34页
《类隐藏实现》PPT课件_第2页
第2页 / 共34页
《类隐藏实现》PPT课件_第3页
第3页 / 共34页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第五章 类:隐藏实现,面向对象程序设计(C+),5.2 隐藏实现:例,内部电路(实现)有不同;,但操作界面(接口)总是相同的。,KV-HR32M90,Ver 1.1,Ver 1.0,5.2 隐藏实现:必要性,让库的使用者远离一些他们不需要知道的内部实现;,允许库的设计者改变内部实现,而不必担心对客户程序员造成什么影响。,5.2 隐藏实现:原则,Public:,turn_on();,turn_off();,volume_up();,volume_down();,change_channel();,private:,change_red();,change_blue();,change_green();,boundary,将类的功能描述部分作为共有部分接口提供给用户;,将数据的内部表示、功能的内部实现作为私有部分,隐藏起来。,5.2.1 C+的访问控制,Public/private/protected,Public:,公有成员,其后声明的所有成员可以被,所有的人访问。,Private:,私有成员,除了该类型的创建者和类的,内部成员函数之外,任何人不能访问。,Protected:,保护成员,与,Private,基本相同,区别,是继承的结构可以访问,Protected,成员,但不可,以访问,Private,成员。,int main(),B b;,b.i=1;/OK,public,/!b.j=1;/illegal,/!b.f=1.0;/illegal,b.func();/OK,public,/:,注:protected修饰符将在后续章节解释,设置访问控制,struct B,private:,char,j,;,float,f,;,public:,int,i,;,void func();,;,void B:func(),B tempb;,tempb.j,=a;/OK,i,=0;,j,=0;,f,=0.0;,;,OOP的观点,访问控制在库的设计者,(,实现者,),和库的使用者之,间划了一道明显的界线;,j,和,f,需要保护;,i,和,func,(),可以公开,若试图访问一个私有成员,就会产生一个,编译,时错误,。,5.2.2 友元,友元:显示地声明哪些人“可以访问我的私有实现,部分”。表明的是一种“信任”的关系。,struct Cfather,friend struct CMother;/赋予CMother访问,/Cfather的salary的权利,private:,long salary;,;,;,struct CMother,priavte:,void inspect(),Cfather obj_TaDie(8000);,cout“月收入:”i=i;/访问X的私有成员i,void Y:f(X*x),x-i=47;/访问X的私有成员i,void h(),X x;,x.i=100;/,直接访问私有成员,int main(),X x;,Z z;,z.g(,/:,struct Z,private:,int j;,public:,void initialize();,void g(X*x);,;,void Z:initialize(),j=99;,void Z:g(X*x),x-i+=j;,OOP的视点,友员不是,OOP,的特征,破坏了封装性,这也是,C+,不是“纯,”,面向对象语言的原因之一。,5.2.3 从struct到class,封装,:数据成员,+,成员函数,抽象数据类型,访问控制,:接口与实现的分离,C,的,struct,+,封装,+,访问控制,=,类,(,Class,),思考:,CStash和CStack中,哪些成员应该设置为私有的?,哪些成员应该设置为公有的?,例1:带访问控制的类Stash,class Stash,private:,int size;/Size of each space,int quantity;/Number of storage spaces,int next;/Next empty space,unsigned char*storage;,void inflate(int increase);,public,:,void initialize(int size);,void cleanup();,int add(void*element);,void*fetch(int index);,int count();,;,例2:有访问控制的类 Stack,#ifndef STACK2_H,#define STACK2_H,class Stack,struct,Link,/私有的,void*data;,Link*next;,void initialize(void*dat,Link*nxt);,*head;,public:,void initialize();,void push(void*dat);,void*peek();,void*pop();,void cleanup();,;,#endif/STACK2_H/:,5.2.3.1 Class和Struct的区别,class,X,int i;/私有成员,int y;/私有成员,void f();/私有成员,class,的成员默认为,Private;,struct,的成员默认为,Public.,struct,X,int i;/公有成员,int y;/公有成员,void f();/公有成员,5.2.4 访问控制的一个陷阱,返回,private,数据成员的非,const,引用,:,当类的,public,成员函数,f,返回对该类,private,成员,m,的,非,const,引用,时,如果,f,的调用作为赋值语句的左值,则访问控制不起作用,对象的使用者可以直接存取,m,的值。,称这种情形为访问控制的“陷阱”。,class X,private:,int i;,public:,int&,badseti(int j),i=(j0)?j:(-j);,return i;,/返回私有成员i的引用,;,void main(),X objx;,objx.badseti(10);/i的值为10;,objx.badseti(-5)=-20;/此时i的值为-20;,例1,例2,class Time,public:,Time(int=0,int=0,int=0);,void setTime(int,int,int);,int getHour();,int&,badSetHour(int);/,危险的返回值,private:,int hour;,int minute;,int second;,;,#include time4.h,#include,Time:Time(int hr,int min,int sec),setTime(hr,min,sec);,void Time:setTime(int h,int m,int s),hour =(h=0,minute=(m=0,second=(s=0,/Get the hour value,int Time:getHour()return hour;,/Fig.6.11:time4.cpp,/极其危险的做法:,/Returning a reference to a private data member.,int&,Time:badSetHour(int hh),hour=(hh=0,return hour,;/DANGEROUS reference return,#include,#include time4.h,int main(),Time t;,int,/Fig.6.11:fig06_11.cpp,cout Hour before modification:hourRef;,hourRef=30,;/modification with invalid value,cout nHour after modification:t.getHour();,/Dangerous:Function call that returns,/a reference can be used as an lvalue!,t.badSetHour(12)=74,;,cout badSetHour as an lvalue,Hour:,t.getHour(),n*endl;,return 0;,20,30,74,如何填补这个陷阱?,利用,const!,#include,#include,class Ctest,char*str;,public:,Ctest(int sz),str=new charsz;,strcpy(str,ustc is a famouse uni.);,Ctest()delete str;,char const*getstr()const,return str;,;,例3:返回char*,int main(int argc,char*argv),Ctest t1(100);,strcpy(t1.getstr(),“TEST!);/ERROR,cout i;,void Handle:change(int x),smile-i=x;,/:,实现:需要隐藏的部分(,Handle.cpp),/Handle implementation,#include Handle.h,#include./require.h,/句柄类的实现:cheshire,struct Handle:Cheshire,int i;,;,void Handle:initialize(),smile=new Cheshire;,smile-i=0;,优点,由于实现部分并没有暴露在,.h,中,保密性好;,因为实现的细节均隐藏在句柄类的背后,因此,当实现发生变化时,句柄类并没有改变,也就,不必重新编译客户程序,只需重新编译隐藏的,实现这一小部分代码,然后连接,(link),就行了。,减少了大量的重复编译。,小结,访问控制:,public/private/protected,友元,:friend,访问控制的陷阱:返回,private,数据成员的非,const,引用,句柄类:隐藏实现源代码,两方面的优点,作业:,P279(,中文版,P144),5.1,5.5,5.13 (,上机,),补充题:,创建,Cfather,Cmother,类,包括姓名、年龄、月薪等属性,另外爸爸会打网球,妈妈会织毛衣。按你自己的喜好设置访问控制。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!