第五章数据的共享与保护.ppt

上传人:本田雅阁 文档编号:3118679 上传时间:2019-07-12 格式:PPT 页数:44 大小:223.52KB
返回 下载 相关 举报
第五章数据的共享与保护.ppt_第1页
第1页 / 共44页
第五章数据的共享与保护.ppt_第2页
第2页 / 共44页
第五章数据的共享与保护.ppt_第3页
第3页 / 共44页
第五章数据的共享与保护.ppt_第4页
第4页 / 共44页
第五章数据的共享与保护.ppt_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《第五章数据的共享与保护.ppt》由会员分享,可在线阅读,更多相关《第五章数据的共享与保护.ppt(44页珍藏版)》请在三一文库上搜索。

1、第五章 数据的共享与保护,佘欣媛,5.1 作用域与可见性,作用域:是标识符的有效范围; 可见性:标识符是否可以引用的问题;,5.1.1 作用域,1、函数原型的作用域 2、块作用域 3、类作用域 4、命名空间作用域,1、函数原型的作用域,函数原型中的参数,其作用域始于 “(“,结束于“)“。 例如,设有下列原型声明: double Area(double radius);/函数的声明,radius 的作用域仅在于此,不能用于程序正文其它地方,因而可有可无。,2、块作用域,块是一对花括号括起来的一段程序单元。 在块中声明的标识符,其作用域从声明处开始,直到块结束的右花括号。 例如: void fu

2、n(int a) int b=a; cinb; if (b0) int c; ,b的作用域,3、类作用域,class X public: int m; int GetM(); ; int X:GetM() return m; ,X类的成员m具有类作用域,3、对类的成员三种访问方式,(1)如果在X的成员函数中没有声明相同的局部作用域标识符,那么在该函数内可以直接访问成员m (2)通过表达式x.m或X:m访问 (3)通过表达式ptr-m访问,ptr为指向X类的一个对象的指针,(1)如果在X的成员函数中没有声明相同的局部作用域标识符,那么在该函数内可以直接访问成员m,class X public:

3、int m; int GetM(); ; int X:GetM() return m; ,成员函数,成员数据,类内成员可以互相直接访问,class X public: int m; void GetM(int m); ; void X:GetM(int m) coutmendl; return; ,成员函数,函数GetM的形参局部变量,这是哪个m,局部变量,(2)通过表达式x.m或X:m访问,class X public: int m; void GetM(int m); ; void main() X x; x.m = 3; return; ,(3)通过表达式ptr-m访问,ptr为指向X类

4、的一个对象的指针,class X public: int m; void GetM(int m); ; void main() X x; X *pClass = x; pClass-m = 3; return; ,等同于 x.m = 3,、命名空间作用域,namespace 命名空间名 命名空间名内的各种声明; ;,可以是各种东西的声明都行:函数、类、变量,namespace she int iSheNum; class TestClass public: int iNum; ; void function1(); ;,命名空间名字,数据变量,类,函数,命名空间中标识符的引用,using na

5、mespace 命名空间名; using 命名空间:标识符名; 命名空间:标识符名,using namespace 命名空间名;,#include using namespace std; void main() cout“命名空间引用”; ,using 命名空间:标识符名;,namespace she int iSheNum; int iNotUsing; ; using she:iSheNum; void main() iSheNum = 2; coutiSheNumendl; iNotUsing = 3; return; ,一旦使用了红色声明,那么用到iSheNum的各处都不用指明出处,

6、iNotUsing的使用会报错吗,会,因为没有声明引用,命名空间:标识符名,namespace she int iSheNum; int iNotUsing; ; using she:iSheNum; void main() iSheNum = 2; coutiSheNumendl; she: iNotUsing = 3; return; ,这样子就对了,命名空间是开放的,即可以随时把新的成员名称加入到已有的命名空间之中去。 方法:多次声明和定义同一命名空间,每次添加自己的新成员和名称。,namespace A int i; void f(); / 现在A有成员i和f(),namespace

7、A int j; void g(); / 现在A有成员i、f()、j和g(),命名空间可以嵌套定义,Namespace 命名空间名1 namespace 命名空间名2 ; ;,namespace outer int iOuter; namespace inner int iInner; ; ; void main() outer:iOuter = 5; outer:inner:iInner = 6; ,5.1.2 可见性,程序运行到某一点。能够引用到的标识符,就是该处可见的标识符。 可见性表示从内层作用域向外层作用域“看”时能看见什么。,块作用域,类作用域,命名空间作用域,作用域包含关系,作用

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

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

10、Num = 0; iNum+; coutiNumendl; void main() function1(); function1(); ,运行结果?,1 1,void function1() static int iNum = 0; iNum+; coutiNumendl; void main() function1(); function1(); ,运行结果?,1 2,5.2.2 动态生存期,声明处,所在作用域结束,除了静态生存期的都是动态生存期,#include void fun( ); void main( ) fun( ); fun( ); void fun( ) static int

11、 a=1; int i=5; a+; i+; cout“i=“i“,a=“aendl; ,这里所讲静态、动态生存期不单单针对普通变量,同样适用于类对象,void crePoint() point myPoint; myPoint.iNum = 1; myPoint.set(); myPoint.set(); myPoint.show(); int main() crePoint(); myPoint.show(); ,point myPoint; 看到这 void crePoint() myPoint.iNum = 1; myPoint.set(); myPoint.set(); myPoin

12、t.show(); int main() crePoint(); myPoint.show(); ,5.3 类的静态成员,5.3.1 静态数据成员 5.3.2 静态函数成员,普通的类,Int iNum void function(),Point类,分配了内存,分配了内存,没有分配内存 是虚无的,各个对象有各自的数据和函数,5.3.1 静态数据成员,在普通数据成员的声明前面加了static标志,class Point public: Point(); int X; static int countP; ; int countP = 0;,需要在类外单独初始化,有静态数据的类,int X; sta

13、tic int countP; Point();,Point类,分配了内存,分配了内存,其他没有分配内存 是虚无的,各个对象有各自的数据和函数,countP分配了内存,为各个对象共享,class Point public: Point(); int X; private: static int countP; ; int countP = 0;,用来分配内存,虽然是私有变量但是可以在类外初始化,void main() Point myPoint; ,Point: countP;,如何引用静态成员countP,myPoint : X;,如何引用普通成员X,5.3.2 静态函数成员,有静态数据的类,int X; static void f(); Point();,Point类,分配了内存,分配了内存,其他没有分配内存 是虚无的,各个对象有各自的数据和函数,static void f(),为各个对象共享,class A public: static void f(A a); void show(); private: int x; static int iNum; ; void A:f(A a) coutx; /对x的引用是错误的 couta.x; /正确 coutiNum; /正确 ,void main() A myA; A:f(); myA.show(); ,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1