第5数据的共享和保护.ppt

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

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

1、C+语言程序设计基础,第5章 数据的共享与保护,5.1 标识符的作用域与可见性 5.2 对象的生存期 5.3 类的静态成员 5.4 类的友元 5.5 共享数据的保护 5.6 多文件结构和编译预处理命令,5.1 标识符的作用域与可见性,作用域是一个标识符的有效范围 函数原型作用域 局部作用域(块作用域) 类作用域 命名空间作用域 可见性是讨论标识符是否可以被引用 可见性表示从内层作用域向外层作用域“看”时能看见什么 如果标识在某处可见,则就可以在该处引用此标识符,函数原型作用域,函数原型中的参数,其作用域始于 “(“,结束于“)“。 例如,设有下列原型声明: double Area(double

2、 r); r的作用域仅在于此,不能用于程序正文其他地方,因而可有可无。,局部作用域,在块中声明的标识符,其作用域自声明处起,限于块中,例如: void fun(int a) int b(a); cinb; if (b0) int c; coutc; ,C的作用域,b的作用域,a的作用域,类作用域,类作用域作用于特定的成员名。 类X的成员M具有类作用域,对M的访问方式如下: 如果在X的成员函数中没有声明同名的局部作用域标识符,那么在该函数内可以访问成员M。 通过表达式x.M或者X:M访问。 通过表达式prt-M。,7,4. 命名空间作用域,命名空间可以解决类名、函数名等的命名冲突 命名空间的声明

3、:namespace 命名空间名 函数声明、类声明、 例:namespace SomeNs class SomeClass . ; 特殊的命名空间 全局命名空间:默认的命名空间 匿名命名空间:对每个源文件是唯一的,命名空间作用域,一个命名空间确定了一个命名空间作用域 引用其它命名空间作用域中的标识符 命名空间名:标识符名 例:声明一个SomeClass型的对象 SomeNs:SomeClass obj1; 将其它命名空间作用域的标识符暴露于当前作用域 对指定标识符 using 命名空间名:标识符名; 对所有标识符 using namespace命名空间名;,8,可见性,标识符应声明在先,引用在

4、后 如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见 对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见 同一作用域中的同名标识符 在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名 重载的函数可以有相同的函数名,#include using namespace std; int i; /在全局命名空间中的全局变量 namespace Ns int j; /在Ns命名空间中的全局变量 int main() i = 5; /为全局变量i赋值 Ns:j = 6; /为全局变量j赋值 /子块1

5、 using namespace Ns; /当前块中可以直接引用Ns中的标识符 int i; /局部变量,局部作用域 i = 7; cout “i = “ i endl;/输出7 cout “j = “ j endl;/输出6 cout “i = “ i endl; /输出5 return 0; ,例题,5.2 对象的生存期,对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值直到被更新为止 静态生存期: 它的生存期与程序的运行期相同 在命名空间作用域中声明的对象具有这种生存期 在函数内部声明静态生存期对象,要加关键字static 动态生存期 块作用域中声明的,没有用st

6、atic修是的对象是动态生存期的对象(习惯称局部生存期对象) 开始于程序执行到声明点时,结束于命名该标识符的作用域结束处,生存期,整个程序运行期间都存在 声明时如没有赋初值,编译时自动初始化为0 不可被其他函数引用 在编译时赋初值,以后每次函数调用时不再赋初值,而是使用上一次函数调用结束后的值 例题:程序运行结果,#include using namespace std; int f() auto int b=0; static int c=0; b+; c+; cout“b=“b; cout“ c=“cendl; return(b+c); int main() int i; for(i=0;

7、i3;i+) coutf()endl; return 0; ,5.3 类的静态成员,静态成员:解决同一个类的不同对象之间数据和函数的共享 例如:雇员总数这个值为雇员类的所有对象所共享 静态数据成员 用关键字static声明 该类的所有对象维护该成员的同一个拷贝 必须在类外定义和初始化,用(:)来指明所属的类。,具有静态数据成员的 Point类,#include using namespace std; class Point public: Point(int xx=0, int yy=0); Point(Point ,int Point:countP=0; Point:Point(int x

8、x, int yy) X=xx; Y=yy; countP+; Point:Point(Point ,#include “iostream“ using namespace std; #include “point.h“ int main() Point p1(4,5),p2(A); p1.GetC(); Point p3; p3.GetC(); p2.GetC(); return 0; ,程序的运行结果为: Object id=2 Object id=3 Object id=2,静态成员函数,专门引用属于该类的静态数据成员或静态成员函数的函数 例如:定义了静态数据成员:雇员总数,但是该成员为

9、私有,必须定义公有函数成员来实现雇员总数加一、输出值等功能 类外代码可以使用类名和作用域操作符来调用静态成员函数,具有静态数据、函数成员的类,#include using namespace std; class Point public: Point(int xx=0,int yy=0) X=xx; Y=yy; countP+; Point(Point ,int main() Point:GetC(); /输出对象个数,类名引用 Point p1(4,5),p2(A); p1.GetC(); /输出对象个数,对象名引用 Point p3; p3.GetC(); p2.GetC(); /输出对

10、象个数,对象名引用 Point:GetC(); /输出对象个数,类名引用 return 0; ,class A public: static void f(A a); private: int x; ; void A:f(A a) coutx; /对x的引用是错误的 couta.x; /正确 ,静态成员函数举例:,访问非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名访问,5.4 类的友元,友元是C+提供的一种破坏数据封装和数据隐藏的机制 外界只能访问类的public成员,通过friend修饰符,将一个模块声明为另一个模块的友元,则该友元能够引用到另一个模块中隐藏的信息 可以使用友元

11、函数和友元类 为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用友元,友元函数,友元函数是在类声明中说明的非成员函数,由关键字friend修饰,该友元函数体中能够通过对象名访问 private 和 protected成员 作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择 访问对象中的成员必须通过对象名,使用友元函数计算两点距离,#include #include using namespace std; class Point friend float Distance(Point ,double Distance( Point ,友元类,一个类作为另一个类的友元,

12、这个类的所有成员函数都是另一个类的友元函数 友元关系是单向的、不可传递的和不可继承的 class X friend class Y; public: private: ; class Y ; /则Y中的所有成员函数都可引用X中的任何成员,5.5 共享数据的保护,5.5.1 常对象 常类型的对象必须进行初始化,而且不能被更新 常对象:该对象的数据成员值在对象的整个生存期间内不能被改变。即必须进行初始化,且不能被更新 const 类名 对象名; 常引用:被引用的对象不能被更新。 const 类型说明符 &引用名,常对象举例,class A public: A(int i,int j) x=i; y

13、=j; void set(int i,int j) x=i; y=j; void show()coutxyendl; private: int x,y; ; const A a(3,4); /a是常对象,不能被更新 a.set(5,7); /error a.show(); /error,5.5.2 用const修饰的类成员,常成员函数:使用const关键字说明的函数 常成员函数不更新对象的数据成员 常对象只能调用const常成员函数 常成员函数说明格式: 类型说明符 函数名(参数表)const; 这里,const是函数类型的一个组成部分,因此在实现部分也要带const关键字。 const关键字

14、可以被用于参与对重载函数的区分 如void print(); 和void print() const;重载 常数据成员 使用const说明的数据成员,例:常成员函数举例,#include using namespace std; class R public: R(int r1, int r2) R1=r1;R2=r2; void print(); void print() const; private: int R1,R2; ;,void R:print() coutR1“:“R2endl; void R:print() const coutR1“;“R2endl; int main() R

15、 a(5,4); a.print();/调用void print() const R b(20,52); b.print(); /调用void print() const return 0; ,例:常数据成员举例,#include using namespace std; class A public: A(int i); void print(); private: const int a; static const int b; ;,const int A:b=10; A:A(int i):a(i) void A:print() couta“:”bendl; int main() A a1

16、(100),a2(0); a1.print(); a2.print(); ,例:常引用作形参,#include using namespace std; void display(const double ,5.6 多文件结构和编译预处理命令,规模较大的项目(project)需要多个源程序文件 类的声明文件(*.h文件) 类的实现文件(*.cpp文件) 类的使用文件(*.cpp文件,包含主函数) 可以对不同的文件进行单独编写、编译,再链接 程序的调试、修改时可以只对其中某一个类的声明和实现进行修改 利用工程(workspace)来组合各个文件 注意:模版的声明与定义必须写在同一个文件中,/Cl

17、ock.h文件,类的声明 class Clock private: int Hour, Minute, Second; public: void SetTime(int h=0,int m=0,s=0); void ShowTime(); ;,/Clock.cpp,类的实现 #include using namespace std; #include “Clock.h“ void Clock:SetTime(int h,int m,int s) Hour = h; Minute =m; Second =s; void Clock:ShowTime() cout Hour “:“ Minute“

18、:“ Second; ,/prjClock.cpp,类的使用 #include using namespace std; #include “Clock.h“ int main() Clock myClock; cout “First Show:“; myClock.SetTime(); myClock.ShowTime(); return 0; ,条件编译指令,在多文件工程中,由于#include指令的嵌套使用,头文件可能被多次包含,编译时造成类的重复定义等错误。条件编译指令可以避免该错误 如要被包含的程序段改写如下: #ifndef HEAD_H #define HEAD_H 类定义 #endif,

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

当前位置:首页 > 其他


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