数据的共享与保护

上传人:新** 文档编号:584557954 上传时间:2024-08-31 格式:PPT 页数:44 大小:177KB
返回 下载 相关 举报
数据的共享与保护_第1页
第1页 / 共44页
数据的共享与保护_第2页
第2页 / 共44页
数据的共享与保护_第3页
第3页 / 共44页
数据的共享与保护_第4页
第4页 / 共44页
数据的共享与保护_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《数据的共享与保护》由会员分享,可在线阅读,更多相关《数据的共享与保护(44页珍藏版)》请在金锄头文库上搜索。

1、第五章第五章 数据的共享与保数据的共享与保护护佘欣媛5.1 作用域与可见性作用域:是标识符的有效有效范围;可见性:标识符是否可以引用引用的问题;5.1.1 作用域1、函数函数原型的作用域原型的作用域2、块块作用域作用域3、类类作用域作用域4、命名空间命名空间作用域作用域1、函数原型的作用域函数原型中的参数,其作用域始于函数原型中的参数,其作用域始于(,结束于,结束于)。例如,设有下列原型声明:例如,设有下列原型声明:double Area(double double Area(double radiusradius);/);/函数的声明函数的声明函数的声明函数的声明radius 的作用域仅在于

2、此,不的作用域仅在于此,不能用于程序正文其它地方,因能用于程序正文其它地方,因而可有可无。而可有可无。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、用域3、类作用域、类作用域class Xclass 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访问(3)通过表达式ptr-m访问,ptr为指向X类的一个对象的指针(1)如果在如果在X的成员函数中没有声明的成员函数中没有声明相同的局部作用域标识符,那么在

4、相同的局部作用域标识符,那么在该函数内可以直接访问成员该函数内可以直接访问成员mclassXclassX public:public:intint m m; ;intintGetMGetM();(); ;intX:intX:GetMGetM() () returnreturnmm; ; 成员函数成员函数成员数据成员数据类内成员可以互相直接访问类内成员可以互相直接访问classXclassX public:public:intint mm; ;voidGetM(intm);voidGetM(intm); ;voidX:voidX:GetMGetM( (intint mm) ) coutcoutm

5、mendl;m访问,访问,ptr为指向为指向X类的一个对象的指针类的一个对象的指针classXclassX public:public:intm;intm;voidGetM(intm);voidGetM(intm); ;voidmain()voidmain() Xx;Xx;XX*pClass*pClass=x;=x;pClasspClass-m=3;m=3;return;return; 等同于等同于 = 3、命名空间作用域namespace 命名空间名命名空间名 命名空间名内的命名空间名内的各种声明各种声明;;可以是可以是各种东西各种东西的声明都行:的声明都行:函数、类、变量函数、类、变量na

6、mespace namespace sheshe int iSheNum;int iSheNum;class TestClassclass TestClass public:public:int iNum;int iNum; ; void function1(); void function1(); ;命名空间名字命名空间名字数据变量数据变量类类函数函数命名空间中标识符的引用命名空间中标识符的引用using namespace 命名空间名命名空间名;using 命名空间命名空间:标识符名标识符名;命名空间命名空间:标识符名标识符名using namespace 命名空间名;#includeus

7、ing namespace std;void main() cout“命名空间引用命名空间引用”;using 命名空间:标识符名;namespacenamespacesheshe intintiSheNum;iSheNum;intint iNotUsing;iNotUsing; ;usingshe:iSheNum;usingshe:iSheNum;voidmain()voidmain() iSheNumiSheNum=2;=2;coutcoutiSheNumiSheNumendl;endl; iNotUsing iNotUsing=3;=3;return;return; 一旦使用了红色声明,那

8、么用一旦使用了红色声明,那么用到到iSheNum的的各处都不用指明各处都不用指明出处出处iNotUsing的使用会报错吗的使用会报错吗会,因为没有声明引用会,因为没有声明引用命名空间:标识符名namespacenamespacesheshe intintiSheNum;iSheNum;intint iNotUsing;iNotUsing; ;usingshe:iSheNum;usingshe:iSheNum;voidmain()voidmain() iSheNumiSheNum=2;=2;coutcoutiSheNumiSheNumendl;endl; she:she: iNotUsing i

9、NotUsing=3;=3;return;return; 这样子就对了这样子就对了命名空间是开放的,即可以随时随时把新的成员名称加入到已有的命名空间加入到已有的命名空间之中去。方法方法:多次声明和定义同一命名空间多次声明和定义同一命名空间,每次添加添加自己的新成员和名称新成员和名称。namespacenamespace A A intinti; i; voidvoidf();f(); /现在现在A A有成员有成员i i和和和和f()f() namespacenamespaceA Aintintj; j; voidvoidg();g(); /现在现在A A有成员有成员i i、f()f()、j j

10、和和和和g()g() 命名空间可以嵌套定义命名空间可以嵌套定义Namespace命名空间名命名空间名1namespace命名空间名命名空间名2;namespacenamespaceouterouter intintiOuteriOuter; ;namespacenamespaceinnerinner intintiInneriInner; ; ; ;voidmain()voidmain() outer:outer:iOuteriOuter=5;=5;outer:outer:inner:inner:iInneriInner=6;=6; 5.1.2 可见性可见性程序运行到某一点。能够引用到的标识符

11、,程序运行到某一点。能够引用到的标识符,就是该处可见的标识符。就是该处可见的标识符。可见性表示从内层作用域向外层作用域“看”时能看见什么。块作用域块作用域类作用域类作用域命名空间作用域命名空间作用域作用域包含关系作用域包含关系作用域可见性的一般规则:作用域可见性的一般规则: 标识符应声明在先,引用在后。标识符应声明在先,引用在后。 在同一作用域中,不能声明同名的标识符。在同一作用域中,不能声明同名的标识符。 如果某个标识符在外层中声明,且在内层中没有同一标如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。识符的声明,则该标识符在内层可见。 对于两个嵌套的作用域,

12、如果在内层作用域内声明了与对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。内层不可见。1、标识符应声明在先,引用在后、标识符应声明在先,引用在后voidmain()iNum=9;intiNum;voidmain()intiNum;iNum=9;2、在同一作用域中,不能声明同名、在同一作用域中,不能声明同名的标识符。的标识符。voidmain()intiNum;/变量的声明intiNum=9;/重复定义/提示redefinition如果某个标识符在外层中声明,且在内层中没有如果某个标识符在

13、外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见。同一标识符的声明,则该标识符在内层可见。对于两个嵌套的作用域,如果在内层作用域内声对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见。域的标识符在内层不可见。voidmain()inta=1;inta=2;coutaendl;5.2 对象的生存期对象的生存期产生产生结束结束生存期生存期静态生存期动态生存期5.2.1 静态生存期静态生存期生存期与程序的运行期相同从执行程序开始到退出程序命名空间中的函数内部有static修饰的stati

14、c int iNum;开始运行程序开始运行程序退出程序退出程序voidfunction1()intiNum=0;iNum+;coutiNumendl;voidmain()function1();function1();运行结果?11voidfunction1()staticintiNum=0;iNum+;coutiNumendl;voidmain()function1();function1();运行结果?125.2.2 动态生存期动态生存期声明处声明处所在作用域结束所在作用域结束除了静态生存期的都是动态生存期#includevoid fun( );void main( ) fun( ); f

15、un( );void fun( ) static int a=1; int i=5; a+; i+; couti=i,a=aendl;这里所讲静态、动态生存期生存期不单单针对普通变量,同样适用适用于类对象类对象voidcrePoint()voidcrePoint() pointpoint myPoint;myPoint;=1;=1;();();();();();(); intmain()intmain() crePoint();crePoint();myPointmyPoint.show();.show(); pointmyPoint;pointmyPoint;看到这voidcrePoint(

16、)voidcrePoint() =1;=1;();();();();();(); intmain()intmain() crePoint();crePoint();();(); 5.3 类的静态成员类的静态成员5.3.1静态数据成员5.3.2静态函数成员普通的类普通的类IntiNumvoidfunction()Point类IntiNumvoidfunction()对象1IntiNumvoidfunction()对象2分配了内存分配了内存分配了内存分配了内存没有分配内存没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数5.3.1 静态数据成员静态数据成员在普通数据成

17、员的声明前面加了static标志classPointpublic:Point();intX;staticintcountP;intcountP=0;需要在类外单独需要在类外单独初始化初始化有静态数据的类有静态数据的类intX;staticintcountP;Point();Point类intX;Point();对象1intX;Point();对象2分配了内存分配了内存分配了内存分配了内存其他没有分配内存其他没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数countP分配了内存,为各个对象各个对象共享共享classPointpublic:Point();intX;

18、private:staticintcountP;intcountP=0;用来分配内存用来分配内存虽然是私有变量虽然是私有变量但是可以在类外但是可以在类外初始化初始化voidmain()PointmyPoint;Point:countP;如何引用静态成员countPmyPoint :X;如何引用普通成员X5.3.2 静态函数成员静态函数成员有静态数据的类有静态数据的类intX;staticvoidf();Point();Point类intX;Point();对象1intX;Point();对象2分配了内存分配了内存分配了内存分配了内存其他没有分配内存其他没有分配内存是虚无的是虚无的各个对象有各自各个对象有各自的数据和函数的数据和函数staticvoidf(),为各个各个对象共享对象共享classApublic:staticvoidf(Aa);voidshow();private:intx;staticintiNum;voidA:f(Aa)coutx;/对x的引用是错误的cout;/正确coutiNum;/正确voidmain()AmyA;A:f();();

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号