《第五章数据的共享与保护》由会员分享,可在线阅读,更多相关《第五章数据的共享与保护(44页珍藏版)》请在金锄头文库上搜索。
1、办逼萌仰拧闪垃恭砧葫款瞬案忍殃淤笑迂光甥喧腋扑惹依荚卫统答糠夏查第五章数据的共享与保护第五章数据的共享与保护第五章第五章 数据的共享与保数据的共享与保护护佘欣媛姥涤剐您穿饮馋樟捆竞衔签十歌手氰耗旬呵适厨戮勿砷蒋髓帛削栅要昏徽第五章数据的共享与保护第五章数据的共享与保护5.1 作用域与可见性作用域:是标识符的有效有效范围;可见性:标识符是否可以引用引用的问题;墨提酬楚亏恶昂巾纳佬翼拴泅付胖道甚修碟苏斥慨昨愚胎球诫蒜磊嘲起骂第五章数据的共享与保护第五章数据的共享与保护5.1.1 作用域1、函数函数原型的作用域原型的作用域2、块块作用域作用域3、类类作用域作用域4、命名空间命名空间作用域作用域巷脯锣
2、收万帘猎脆爸南趾嘴釜褂乙椎拐警碎罚郡滴狙后那二禁倚涯悦廉舜第五章数据的共享与保护第五章数据的共享与保护1、函数原型的作用域函数原型中的参数,其作用域始于函数原型中的参数,其作用域始于(,结束于,结束于)。例如,设有下列原型声明:例如,设有下列原型声明:double Area(double double Area(double radiusradius);/);/函数的声明函数的声明函数的声明函数的声明radius 的作用域仅在于此,不的作用域仅在于此,不能用于程序正文其它地方,因能用于程序正文其它地方,因而可有可无。而可有可无。掖阵耳椎肯带敌免崖笔尽踊舔伎异欠谨券悄淘流秋吟纠哟末锤羊驾督蛇矩第
3、五章数据的共享与保护第五章数据的共享与保护2、块作用域、块作用域块是一对花括号括起来花括号括起来花括号括起来花括号括起来的一段程序单元。在块中声明的标识符,其作用域从声明处开始,直到块结束的右花括号。例如:void fun(int void fun(int a a) ) int int b b= =a a; ; cin cinb b; ; if ( if (b b0)0) int int c c; ; . . c的作用域的作用域b的作用域的作用域则堑永赐饰八捆陵狞赁晃旦崇样钙蚤啤正江琳触淋古赂概线广既拖诞冒汗第五章数据的共享与保护第五章数据的共享与保护3、类作用域、类作用域class Xcla
4、ss X public:public:int int mm; ;int GetM();int GetM(); ;int X:GetM()int X:GetM() return m;return m; X类的成员m具有类类作用域作用域品悠邓聊膨品毙砚回皖确硼绦癸凹躇喜病忙甸杖得锭糠适音潦士衰僳纲痉第五章数据的共享与保护第五章数据的共享与保护3、对类的成员三种访问方式、对类的成员三种访问方式(1)如果在X的成员函数中没有声明相同的局部作用域标识符,那么在该函数内可以直接访问成员m(2)通过表达式x.m或X:m访问(3)通过表达式ptr-m访问,ptr为指向X类的一个对象的指针馅榴琉贩蔓颖幢溯叠氛敛
5、穆佩妓拘评斌怯纫享冠捞仆敢茎么理匈畅笺喷饮第五章数据的共享与保护第五章数据的共享与保护(1)如果在如果在X的成员函数中没有声明的成员函数中没有声明相同的局部作用域标识符,那么在相同的局部作用域标识符,那么在该函数内可以直接访问成员该函数内可以直接访问成员mclassXpublic:int m m;intGetM();intX:GetM()returnmm;成员函数成员函数成员数据成员数据类内成员可以互相直接访问类内成员可以互相直接访问烙刀钳百纺碱违夕年晨傲远滁劣俯合吞并烬沾滨哎命靴还疯试咋弱囤涛揩第五章数据的共享与保护第五章数据的共享与保护classXpublic:intintmm;voidG
6、etM(intm);voidX:GetMGetM(intintmm)coutmmm访问,访问,ptr为指向为指向X类的一个对象的指针类的一个对象的指针classXpublic:intm;voidGetM(intm);voidmain()Xx;X*pClass*pClass=x;pClass-m=3;return;等同于等同于x.m = 3痊欢适曼斜整奉搬句篡灸虎吮尺殴宿版峪惕煌舒枕租壁屁丰撤佣押畔娟猎第五章数据的共享与保护第五章数据的共享与保护、命名空间作用域namespace 命名空间名命名空间名 命名空间名内的命名空间名内的各种声明各种声明;;可以是可以是各种东西各种东西的声明都行:的声明
7、都行:函数、类、变量函数、类、变量没稚乍鬃累众了谤低刺病畦艳成胳大寂姐馅饰匙禾换吓嘿觉数梦坛腔籽累第五章数据的共享与保护第五章数据的共享与保护namespace namespace sheshe int iSheNum;int iSheNum;class TestClassclass TestClass public:public:int iNum;int iNum; ; void function1(); void function1(); ;命名空间名字命名空间名字数据变量数据变量类类函数函数末鸡稻堆宪疚瞳弥鱼焚链妇责自迸脑份粘咒葫琉搐叁挖挞阑眷肪誉逗甲们第五章数据的共享与保护第五章数据的
8、共享与保护命名空间中标识符的引用命名空间中标识符的引用using namespace 命名空间名命名空间名;using 命名空间命名空间:标识符名标识符名;命名空间命名空间:标识符名标识符名淀吉都钳练顿幢迢磁摇状纺萝键讫神解屿溯寥栏熏韶搞环恩涛瘤腮捎舟撬第五章数据的共享与保护第五章数据的共享与保护using namespace 命名空间名;#includeusing namespace std;void main() cout“命名空间引用命名空间引用”;冉呵呼固账清咖万蕾司秀凋糊锋蚌领誓睦届疗般赘逾耪搁疵栈甚杜导涛陇第五章数据的共享与保护第五章数据的共享与保护using 命名空间:标识符名;
9、namespacesheintiSheNum;intiNotUsing;iNotUsing;usingshe:iSheNum;voidmain()iSheNum=2;coutiSheNumendl; iNotUsing iNotUsing=3;return;一旦使用了红色声明,那么用一旦使用了红色声明,那么用到到iSheNum的的各处都不用指明各处都不用指明出处出处iNotUsing的使用会报错吗的使用会报错吗会,因为没有声明引用会,因为没有声明引用半场魄刨痘极汪终萝欧熄夷挖耳十艘壶邯妊半寡皋忠逗镭穴盏壶浙葫棺闸第五章数据的共享与保护第五章数据的共享与保护命名空间:标识符名namespaces
10、heintiSheNum;intiNotUsing;iNotUsing;usingshe:iSheNum;voidmain()iSheNum=2;coutiSheNumendl; she:she: iNotUsing iNotUsing=3;return;这样子就对了这样子就对了顷译沈争如赘页赖刘浓价扦丝恩骇妻撇膊誓稍婶鲁羹插讥牧豺厅割唇刷苏第五章数据的共享与保护第五章数据的共享与保护命名空间是开放的,即可以随时随时把新的成员名称加入到已有的命名空间加入到已有的命名空间之中去。方法方法:多次声明和定义同一命名空间多次声明和定义同一命名空间,每次添加添加自己的新成员和名称新成员和名称。names
11、paceA A inti; i;voidf();f();/现在A有成员i i和和和和f()f()namespaceA Aintj; j;voidg();g();/现在A有成员i i、f()f()、j j和和和和g()g()妨酸荡痞裹辽赌嗅菏却频肉锚纂豪役铬绑寄醛檬厂梁蓄吧惫课作威罚稿霄第五章数据的共享与保护第五章数据的共享与保护命名空间可以嵌套定义命名空间可以嵌套定义Namespace命名空间名命名空间名1namespace命名空间名命名空间名2;挫腹均眶岩态狄捍话酗回瑰预到纷诣时蛰苍璃帛硫悟训妄挺喳纫葡嚼效坦第五章数据的共享与保护第五章数据的共享与保护namespaceouterintiOu
12、ter;namespaceinnerintiInner;voidmain()outer:iOuter=5;outer:inner:iInner=6;墅蛮芹剁嚏袭堵芝拂浅鸯意迫苍斧狐涟鸽旷色妖蒋诽镜偶掉眯礼搓刊瀑刨第五章数据的共享与保护第五章数据的共享与保护5.1.2 可见性可见性程序运行到某一点。能够引用到的标识符,程序运行到某一点。能够引用到的标识符,就是该处可见的标识符。就是该处可见的标识符。可见性表示从内层作用域向外层作用域“看”时能看见什么。块作用域块作用域类作用域类作用域命名空间作用域命名空间作用域作用域包含关系作用域包含关系渺塔侗式惶抉裸莫柴蚌茁鸣瘟粟耐频铃誓温猜娠趣翟科汉斥擒全借
13、鬼氓享第五章数据的共享与保护第五章数据的共享与保护作用域可见性的一般规则:作用域可见性的一般规则:标识符应声明在先,引用在后。在同一作用域中,不能声明同名的标识符。如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。赢梨碑解线化问写只靖框身丛薄捶易搽叠递粳掌喻酵紧证掖擞粒内晌晨钦第五章数据的共享与保护第五章数据的共享与保护1、标识符应声明在先,引用在后、标识符应声明在先,引用在后voidmain()iNum=9;intiNum;voidmain()intiN
14、um;iNum=9;锈雏豁步远箭咒螺腐报具友精靡棒壁欣摧灸钳终煌顾碴谍圾幌樊凶炔荚护第五章数据的共享与保护第五章数据的共享与保护2、在同一作用域中,不能声明同名、在同一作用域中,不能声明同名的标识符。的标识符。voidmain()intiNum;/变量的声明intiNum=9;/重复定义/提示redefinition封盾软侯契错救祸扁郡泉娇迭央掀讶还灰簧犊烫灸磕纹会帝斗俩撅密滋北第五章数据的共享与保护第五章数据的共享与保护如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识
15、符在内层不可见。voidmain()inta=1;inta=2;coutaendl;层奴佃熔纽疆旺臻肥茅捍工巡端沼蕉啦监艳河惨唱曰救愉猎柞则孪畸前漱第五章数据的共享与保护第五章数据的共享与保护5.2 对象的生存期对象的生存期产生产生结束结束生存期生存期静态生存期动态生存期酞驮珊赵符卞串翟墟贫畴雇皇噶炯挣要快祈馅硝荆员尉炬雕鞘峪腋撼藏遏第五章数据的共享与保护第五章数据的共享与保护5.2.1 静态生存期静态生存期生存期与程序的运行期相同从执行程序开始到退出程序命名空间中的函数内部有static修饰的static int iNum;开始运行程序开始运行程序退出程序退出程序爆印慰住助麓恋篇琐周定记柑战
16、咆瞥掏诅荤匹同虞邹棉贪寞扔铁型辖库履第五章数据的共享与保护第五章数据的共享与保护voidfunction1()intiNum=0;iNum+;coutiNumendl;voidmain()function1();function1();运行结果?11抗铭歌轩诀婴愤酪只悄城撇违诸指圣室瑰冈柳局香舍伟补姜敞积思繁淆转第五章数据的共享与保护第五章数据的共享与保护voidfunction1()staticintiNum=0;iNum+;coutiNumendl;voidmain()function1();function1();运行结果?12癸具泪既堰靶闰纽混吾灾肿构摈焦蹬轻马吉蚊征荷搽卷苇誉讣丰与廉
17、汕池第五章数据的共享与保护第五章数据的共享与保护5.2.2 动态生存期动态生存期声明处声明处所在作用域结束所在作用域结束除了静态生存期的都是动态生存期嫩曾厘捅才威家纳佣洞井督瞄沼寿陀堰运邮愧夸疹懦苛弧呵跪鼓纶淋洗乃第五章数据的共享与保护第五章数据的共享与保护#includevoid fun( );void main( ) fun( ); fun( );void fun( ) static int a=1; int i=5; a+; i+; couti=i,a=aendl;蚀盾搔扑挟休噶渭控哼纠稽烈赘伴覆赶独辨痰岭签藏东耶勾逐晨员藩布娄第五章数据的共享与保护第五章数据的共享与保护这里所讲静态、动
18、态生存期生存期不单单针对普通变量,同样适用适用于类对象类对象咱龄啡罐遥刚痛责倔礼泞姑匡硫袍动揭妒端帐迂进捎倾毫筒迂碰喀搅茁锤第五章数据的共享与保护第五章数据的共享与保护voidcrePoint()pointpointmyPoint;myPoint;myPoint.iNum=1;myPoint.set();myPoint.set();myPoint.show();intmain()crePoint();myPointmyPoint.show();檬伦罕捧岔纽涂辞秉限拇握铜万钓鲸彬敛缔挟詹跟拷废届退协壹缩熏吝彤第五章数据的共享与保护第五章数据的共享与保护pointmyPoint;看到这voidcr
19、ePoint()myPoint.iNum=1;myPoint.set();myPoint.set();myPoint.show();intmain()crePoint();myPoint.show();缨傅蓖琐蛀柱式婉哄瘸欲虹肮勃簇乱茅闭矫孰暑锅韶龚纪彻析决刑歌雷厦第五章数据的共享与保护第五章数据的共享与保护5.3 类的静态成员类的静态成员5.3.1静态数据成员5.3.2静态函数成员撂榜峪荒盾叹组啡展帕拂忽爱亩锈袒力闽豢惹穆话涝或倘繁灯忠藩焰捆铺第五章数据的共享与保护第五章数据的共享与保护普通的类普通的类IntiNumvoidfunction()Point类IntiNumvoidfunctio
20、n()对象1IntiNumvoidfunction()对象2分配了内存分配了内存分配了内存分配了内存没有分配内存没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数陨银己帝尸杨全锰演哪挠单雏坛民兹巷过事剖徽蘑飘渊饶雨瞥张活蚜迄惦第五章数据的共享与保护第五章数据的共享与保护5.3.1 静态数据成员静态数据成员在普通数据成员的声明前面加了static标志classPointpublic:Point();intX;staticintcountP;intcountP=0;需要在类外单独需要在类外单独初始化初始化蹬彪倚衔肠雏碍铭曹仟执迂玉损牡勇厘颖超斧乔讼袋景紧祸荆养盟印喧烛
21、第五章数据的共享与保护第五章数据的共享与保护有静态数据的类有静态数据的类intX;staticintcountP;Point();Point类intX;Point();对象1intX;Point();对象2分配了内存分配了内存分配了内存分配了内存其他没有分配内存其他没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数countP分配了内存,为各个对象各个对象共享共享舵呕壕淫劳脑钠明糜密正酌赠瘦复架嘛矫俩裕崩敏幕联作藕驴詹童烤纱檀第五章数据的共享与保护第五章数据的共享与保护classPointpublic:Point();intX;private:staticintc
22、ountP;intcountP=0;用来分配内存用来分配内存虽然是私有变量虽然是私有变量但是可以在类外但是可以在类外初始化初始化畴撞抗灵旗驼勘乐窿傍锌寒呜拥蜘拷鳞憎叫孩剑逆忘陀拼奈疯哥酿岭敬咸第五章数据的共享与保护第五章数据的共享与保护voidmain()PointmyPoint;Point:countP;如何引用静态成员countPmyPoint :X;如何引用普通成员X遏赤搏闷赏荣毛于淖矢摔冬迎苫藤宽然疼风彬矛绳汤誊洪夕磐怒厅嚣贸耍第五章数据的共享与保护第五章数据的共享与保护5.3.2 静态函数成员静态函数成员朗甸合各汀情幸离衣疏泅颠刊啃蔡虱攻蓟腰骇自捅端政赁铡疲友继揩充一第五章数据的共享
23、与保护第五章数据的共享与保护有静态数据的类有静态数据的类intX;staticvoidf();Point();Point类intX;Point();对象1intX;Point();对象2分配了内存分配了内存分配了内存分配了内存其他没有分配内存其他没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数staticvoidf(),为各个各个对象共享对象共享咎砰脯蒸池巍耳鸣盖踩泡谴鹅峙钳坠褪雁员辖胎喳后矫稚俞缮毋永瞧墩圾第五章数据的共享与保护第五章数据的共享与保护classApublic:staticvoidf(Aa);voidshow();private:intx;staticintiNum;voidA:f(Aa)coutx;/对x的引用是错误的couta.x;/正确coutiNum;/正确认哄搓饱辱掏挖占沦蜡杭山爽炎悄弹牺捐熔贡礼搀袒坠拷赵诞士饮薄炙路第五章数据的共享与保护第五章数据的共享与保护voidmain()AmyA;A:f();myA.show();日替撼损痉吻哥瞧嫡泛临摆剑虞欠跟款喊品安嫂孵抗船枯移撼孝弄蓝激含第五章数据的共享与保护第五章数据的共享与保护