第5数据的共享和保护

上传人:hs****ma 文档编号:567711965 上传时间:2024-07-22 格式:PPT 页数:34 大小:252KB
返回 下载 相关 举报
第5数据的共享和保护_第1页
第1页 / 共34页
第5数据的共享和保护_第2页
第2页 / 共34页
第5数据的共享和保护_第3页
第3页 / 共34页
第5数据的共享和保护_第4页
第4页 / 共34页
第5数据的共享和保护_第5页
第5页 / 共34页
点击查看更多>>
资源描述

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

1、信工学院信工学院中国地质大学(北京)中国地质大学(北京)C+C+语言程序设计基础语言程序设计基础绊订哪西衍愁纯难口尊若禄面羡浇葱狰漠炬镣妄僻飘散役染苗肢倔乳黔茄第5数据的共享和保护第5数据的共享和保护第第5 5章章 数据的共享与保护数据的共享与保护J5.1 5.1 5.1 5.1 标识符的作用域与可见性标识符的作用域与可见性标识符的作用域与可见性标识符的作用域与可见性J5.2 5.2 5.2 5.2 对象的生存期对象的生存期对象的生存期对象的生存期J5.3 5.3 5.3 5.3 类的静态成员类的静态成员类的静态成员类的静态成员J5.4 5.4 5.4 5.4 类的友元类的友元类的友元类的友元

2、J5.5 5.5 5.5 5.5 共享数据的保护共享数据的保护共享数据的保护共享数据的保护J5.6 5.6 5.6 5.6 多文件结构和编译预处理命令多文件结构和编译预处理命令多文件结构和编译预处理命令多文件结构和编译预处理命令馁映新盾费盾脚吐撮弯遂氨制衔颠淤坤汽故秆慢碟抢消蹈薯狂雁其骨七眯第5数据的共享和保护第5数据的共享和保护5.1 5.1 标识符的作用域与可见性标识符的作用域与可见性J作用域是一个标识符的有效范围作用域是一个标识符的有效范围C函数原型作用域函数原型作用域函数原型作用域函数原型作用域C局部作用域(块作用域)局部作用域(块作用域)局部作用域(块作用域)局部作用域(块作用域)C

3、类作用域类作用域类作用域类作用域C命名空间作用域命名空间作用域命名空间作用域命名空间作用域J可见性是讨论标识符是否可以被引用可见性是讨论标识符是否可以被引用C可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域可见性表示从内层作用域向外层作用域“ “看看看看” ”时能看见什么时能看见什么时能看见什么时能看见什么C如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用如果标识在某处可见,则就可以在该处引用此标识符此标识符此标识符此标识符局部作用域局部作用域类作用域类作用域命名空间作用域命

4、名空间作用域烧菇验崔品衡失芹阮紧爪冈格恳胳针密激次的耽函拳毙帝湘劫淖结雏孔妈第5数据的共享和保护第5数据的共享和保护函数原型作用域函数原型作用域J函数原型中的参数,其作用域始于函数原型中的参数,其作用域始于(,结束于,结束于)。J例如,设有下列原型声明:例如,设有下列原型声明:Cdouble Area(double double Area(double r)r); ;r r的的的的作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地作用域仅在于此,不能用于程序正文其他地方,因而方,因而方,因而方,因而可有可无。可有可无。可有可无。可

5、有可无。凰福斡漠他忘效乍畜控俺迈存躺堪滓莆爷眨挖摧蹦矣魏停断蛤桐准寓穴我第5数据的共享和保护第5数据的共享和保护局部作用域局部作用域J在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限在块中声明的标识符,其作用域自声明处起,限于块中,例如:于块中,例如:于块中,例如:于块中,例如:void fun(int a)void fun(int a) int b(a); int b(a); cinb; cinb; if (b0) if (b0) int c; int c; coutc; coutprt-MM。兹蜜誓乱句螺调济泄娟

6、誓赏胞亚亿矫塌龙泳贵右贬镇荐来陕鄂哇孝茹皮疏第5数据的共享和保护第5数据的共享和保护74. 4. 命名空间作用域命名空间作用域JJ命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突命名空间可以解决类名、函数名等的命名冲突JJ命名空间的声明:命名空间的声明:命名空间的声明:命名空间的声明:namespace namespace namespace namespace 命名空间名命名空间名命名空间名命名空间名 函数声明、类声明、函数声明、类声明、函数声明、类声明、函数声明、类声明、 JJ例:例:例:例:namespace Som

7、eNs namespace SomeNs namespace SomeNs namespace SomeNs class SomeClass . ;class SomeClass . ;class SomeClass . ;class SomeClass . ; JJ特殊的命名空间特殊的命名空间特殊的命名空间特殊的命名空间C C全局命名空间:默认的命名空间全局命名空间:默认的命名空间全局命名空间:默认的命名空间全局命名空间:默认的命名空间C C匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的匿名命名空间:对每个源文件是唯一的惊植寐眯蔽赢晋女

8、慎综座鸽疙雕萄金液拣原捆汰歼柏候锰曹薄厦盈粥杠涎第5数据的共享和保护第5数据的共享和保护命名空间作用域命名空间作用域JJ一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域一个命名空间确定了一个命名空间作用域JJ引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符引用其它命名空间作用域中的标识符C C命名空间名命名空间名命名空间名命名空间名: :标识符名标识符名标识符名标识符名C C例:声明一个例:声明一个例:声明一个例:声明一个SomeClassSomeClass型的对象型的对象型的对象型的对

9、象SomeNs:SomeClass obj1;SomeNs:SomeClass obj1;SomeNs:SomeClass obj1;SomeNs:SomeClass obj1;JJ将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用将其它命名空间作用域的标识符暴露于当前作用域域域域C C对指定标识符对指定标识符对指定标识符对指定标识符using using 命名空间名命名空间名命名空间名命名空间名: :标识符名标识符名标识符名标识符名; ;C C对所有标识符对所有标识符对所有标识符对所有标识符using namespa

10、ceusing namespace命名空间名命名空间名命名空间名命名空间名; ;8顶酣舍寡涅震试羡藕痉骡序鸣骤剁雪巾您汲轨拐氮铲肆玖碟赫蔡浩轻屯界第5数据的共享和保护第5数据的共享和保护可见性可见性J标识符应声明在先,引用在后标识符应声明在先,引用在后标识符应声明在先,引用在后标识符应声明在先,引用在后J如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没如果某个标识符在外层中声明,且在内层中没有同一标识符的声明,则该标识符在内层可见有同一标识符的声明,则该标识符在内层可见有同一标识符的声明,则该标识符在内层可见有同一标识符的

11、声明,则该标识符在内层可见J对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内对于两个嵌套的作用域,如果在内层作用域内声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层声明了与外层作用域中同名的标识符,则外层作用域的标识符在内层不可见作用域的标识符在内层不可见作用域的标识符在内层不可见作用域的标识符在内层不可见J同一作用域中的同名标识符同一作用域中的同名标识符同一作用域中的同名标识符同一作用域中的同名标识符C C在同一作用域内的对象名、函数名、枚举常量名会

12、在同一作用域内的对象名、函数名、枚举常量名会在同一作用域内的对象名、函数名、枚举常量名会在同一作用域内的对象名、函数名、枚举常量名会隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名隐藏同名的类名或枚举类型名C C重载的函数可以有相同的函数名重载的函数可以有相同的函数名重载的函数可以有相同的函数名重载的函数可以有相同的函数名答尿别剂敝磅柒嫌冠款润殃庭索仍查改椎溜家标葬瓢诱去连骋刀颁待的拖第5数据的共享和保护第5数据的共享和保护#include #include using namespace std;using namespace std;int i;int i;/

13、 /在全局命名空在全局命名空在全局命名空在全局命名空间间中的全局中的全局中的全局中的全局变变量量量量namespace Ns namespace Ns int j;int j;/ /在在在在NsNs命名空命名空命名空命名空间间中的全局中的全局中的全局中的全局变变量量量量 int main() int main() i = 5;i = 5;/ /为为全局全局全局全局变变量量量量i i赋值赋值Ns:j = 6;Ns:j = 6;/ /为为全局全局全局全局变变量量量量j j赋值赋值 / /子子子子块块1 1using namespace Ns; using namespace Ns; / /当前当前

14、当前当前块块中可以直接引用中可以直接引用中可以直接引用中可以直接引用NsNs中的中的中的中的标识标识符符符符int i;int i;/ /局部局部局部局部变变量,局部作用域量,局部作用域量,局部作用域量,局部作用域i = 7;i = 7;cout i = i endl;/cout i = i endl;/输输出出出出7 7cout j = j endl;/cout j = j endl;/输输出出出出6 6 cout i = i endl; /cout i = i endl; /输输出出出出5 5return 0;return 0; 例题例题亩顺陶辞或巷之棺懂荚躇酸归镐炭哭鄙房免靴栅训图候糜选

15、渤恐拧狰狡它第5数据的共享和保护第5数据的共享和保护5.2 5.2 对象的生存期对象的生存期J对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象从产生到结束的这段时间就是它的生存期。在对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止对象生存期内,对象将保持它的值直到被更新为止C C静态生存期:静态生存期:静态生存期:静态生存期:它的生存期与程序的运行期相同它的生存期与程序的运行期相同它的生存期与程序的运行期相同它的生存期与程序

16、的运行期相同在命名空间作用域在命名空间作用域在命名空间作用域在命名空间作用域中声明的对象具有这种生存期中声明的对象具有这种生存期中声明的对象具有这种生存期中声明的对象具有这种生存期在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字在函数内部声明静态生存期对象,要加关键字staticstaticC C动态生存期动态生存期动态生存期动态生存期块作用域中声明的,没有用块作用域中声明的,没有用块作用域中声明的,没有用块作用域中声明的,没有用staticstatic修是的对象是动态修是的对象是动态修是的对象是动态修是的对象是动态生存期

17、的对象(习惯称局部生存期对象)生存期的对象(习惯称局部生存期对象)生存期的对象(习惯称局部生存期对象)生存期的对象(习惯称局部生存期对象)开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的开始于程序执行到声明点时,结束于命名该标识符的作用域结束处作用域结束处作用域结束处作用域结束处矛嫌嘱程缓圈赐怔穆覆哪丘壁贤析淘抉挖腻幼撩屉抢搂猖笼断陋霹穆帝棠第5数据的共享和保护第5数据的共享和保护生存期生存期J整个程序运行期间都存在整个程序运行期间都存在整个程序运行期间都存在整个程序运行期间都存在J声明时如没有赋初值,编

18、声明时如没有赋初值,编声明时如没有赋初值,编声明时如没有赋初值,编译时自动初始化为译时自动初始化为译时自动初始化为译时自动初始化为0 0 0 0J不可被其他函数引用不可被其他函数引用不可被其他函数引用不可被其他函数引用J在编译时赋初值,以后每在编译时赋初值,以后每在编译时赋初值,以后每在编译时赋初值,以后每次函数调用时不再赋初值,次函数调用时不再赋初值,次函数调用时不再赋初值,次函数调用时不再赋初值,而是使用上一次函数调用而是使用上一次函数调用而是使用上一次函数调用而是使用上一次函数调用结束后的值结束后的值结束后的值结束后的值J例题:程序运行结果例题:程序运行结果例题:程序运行结果例题:程序运

19、行结果#include using namespace std;int f() auto int b=0; static int c=0; b+; c+; coutb=b; cout c=cendl; return(b+c);int main() int i; for(i=0;i3;i+) coutf()endl; return 0;匹烁屠玛螺苇熟衡典黎娩框寇痴冈马士赣纱煎呸庞屠厘隧溉根玉曙耀乎砌第5数据的共享和保护第5数据的共享和保护5.3 5.3 类的静态成员类的静态成员J静态成员:解决同一个类的不同对象之间数静态成员:解决同一个类的不同对象之间数据和函数的共享据和函数的共享C例如:雇员总

20、数这个值为雇员类的所有对象所例如:雇员总数这个值为雇员类的所有对象所例如:雇员总数这个值为雇员类的所有对象所例如:雇员总数这个值为雇员类的所有对象所共享共享共享共享C静态数据成员静态数据成员静态数据成员静态数据成员用关键字用关键字用关键字用关键字staticstatic声明声明声明声明该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝必须在类外定义和初始化,用必须在类外定义和初始化,用必须在类外定义和初始化,用必须在类外定义和初始化,用(:)(:)来指明所属的类。来指明所属的类。来指明所属的类。来指明

21、所属的类。幅昧倾铲库革佛郸嘎仪饯茹撩异酱螺弛诫舀谍魏靶抬曙添怎碑钳介缘迅遣第5数据的共享和保护第5数据的共享和保护具有静态数据成员的具有静态数据成员的 Point Point类类#include #include #include #include using namespace std;using namespace std;using namespace std;using namespace std;class Pointclass Pointclass Pointclass Point public:public:public:public:Point(int xx=0, int yy

22、=0Point(int xx=0, int yy=0Point(int xx=0, int yy=0Point(int xx=0, int yy=0););););PointPointPointPoint(Point &p)(Point &p)(Point &p)(Point &p); ; ; ;Point();Point();Point();Point();int GetX() int GetX() int GetX() int GetX() return return return return X;X;X;X;int GetY() int GetY() int GetY() int Ge

23、tY() return Y;return Y;return Y;return Y;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;void GetC() cout Object id=countPendl;private:private:private:private:int X,Y;int X,Y;int X,Y;int X,Y;static int countP;static int countP;static

24、int countP;static int countP;棺椭美腑阁失矮琢摔秤贾鳃背篓而敌孙划姜侥乳睡醚档显撵顶愚珠沤椰趾第5数据的共享和保护第5数据的共享和保护int Point:countP=0; int Point:countP=0; int Point:countP=0; int Point:countP=0; Point:Point(int xx, int yy)Point:Point(int xx, int yy)Point:Point(int xx, int yy)Point:Point(int xx, int yy) X=xx; Y=yy; X=xx; Y=yy; X=xx;

25、Y=yy; X=xx; Y=yy; countP+; countP+; countP+; countP+; PointPointPointPoint:Point(Point &p):Point(Point &p):Point(Point &p):Point(Point &p) X=p.X;X=p.X;X=p.X;X=p.X;Y=p.Y;Y=p.Y;Y=p.Y;Y=p.Y;countP+;countP+;countP+;countP+; Point:Point()Point:Point()Point:Point()Point:Point() countP-; countP-; countP-;

26、countP-; 桶勘疡必体沼犹靡备悔览杰舟墩疲奈腥揽蝶盔镍瓷戳涡弧痕新仪戌复送班第5数据的共享和保护第5数据的共享和保护#include iostream#include iostream#include iostream#include iostreamusing namespace std;using namespace std;using namespace std;using namespace std;#include point.h#include point.h#include point.h#include point.hint int int int main()main(

27、)main()main() Point p1(Point p1(Point p1(Point p1(4,54,54,54,5),p2(A);),p2(A);),p2(A);),p2(A);p1.p1.p1.p1.GetC();GetC();GetC();GetC(); Point p3;Point p3;Point p3;Point p3;p3.p3.p3.p3.GetC();GetC();GetC();GetC(); p2.GetC(); p2.GetC(); p2.GetC(); p2.GetC();return 0;return 0;return 0;return 0; 程序的运行结果为

28、:程序的运行结果为:Object id=2Object id=2Object id=3Object id=3Object id=2Object id=2杆吞悲括颐澄棍嫩肄褐昔仕掐哪伪攻匀高染庐缺嗡耗肤官荆杆钥匣鹰剩结第5数据的共享和保护第5数据的共享和保护静态成员函数静态成员函数J专门专门引用属于该类的静态数据成员或静态引用属于该类的静态数据成员或静态成员函数的函数成员函数的函数C例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但例如:定义了静态数据成员:雇员总数,但是该成员为私有,必须定义公有函数成员来是该成员为私有,必须定义公

29、有函数成员来是该成员为私有,必须定义公有函数成员来是该成员为私有,必须定义公有函数成员来实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能实现雇员总数加一、输出值等功能J类外代码可以使用类名和作用域操作符来类外代码可以使用类名和作用域操作符来调用静态成员函数调用静态成员函数单旗甜坝番重荡凡汹弹械烟捏涌狼米学酱心放琼雪镁纷炽工颖阴斧活轴搓第5数据的共享和保护第5数据的共享和保护具有静态数据、函数成员的类具有静态数据、函数成员的类#include #include #include #include using namespace std;using nam

30、espace std;using namespace std;using namespace std;class Pointclass Pointclass Pointclass Pointpublicpublicpublicpublic: : : :Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) Point(int xx=0,int yy=0) X=xx; Y=yy; countP+; X=xx; Y=yy; countP+; X=xx; Y=yy; countP+; X=xx; Y=yy;

31、 countP+; Point(Point &pPoint(Point &pPoint(Point &pPoint(Point &p)X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; )X=p.X;Y=p.Y;countP+; Point() countP-; Point() countP-; Point() countP-; Point() countP-; int GetX() return X; int GetX() return X; int GetX() return X; int GetX() retu

32、rn X; int GetY() return Y; int GetY() return Y; int GetY() return Y; int GetY() return Y; static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;static void GetC() coutID=countPendl;private: private: private: private: int X,Y;int X,Y;int X,Y;in

33、t X,Y;static int countP;static int countP;static int countP;static int countP;赡艇育臼凌啤挎殖私广匪诉啡走陈栗摔芦片双诫拳闰奈旦颠虑炔栓姨总晶第5数据的共享和保护第5数据的共享和保护int main()int main()int main()int main() Point:GetC();Point:GetC();Point:GetC();Point:GetC();/输出对象个数,类名引用输出对象个数,类名引用输出对象个数,类名引用输出对象个数,类名引用Point p1(4,5),p2(A);Point p1(4,5

34、),p2(A);Point p1(4,5),p2(A);Point p1(4,5),p2(A);p1.GetC();p1.GetC();p1.GetC();p1.GetC();/输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用 Point p3;Point p3;Point p3;Point p3;p3.GetC();p3.GetC();p3.GetC();p3.GetC(); p2.GetC();p2.GetC();p2.GetC();p2.GetC();/输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对象名引用输出对象个数,对

35、象名引用PointPointPointPoint:GetC();:GetC();:GetC();:GetC();/输出输出输出输出对象个数,对象个数,对象个数,对象个数,类名类名类名类名引用引用引用引用return 0;return 0;return 0;return 0; 洁悸获芍痊灸颜怖孕掐哥粱梁牢苟催劣哮暖讣轮怖倍江坝畔疵屹工浴廉寂第5数据的共享和保护第5数据的共享和保护class Aclass Aclass Aclass A public: public: public: public: static void f(A a); static void f(A a); static vo

36、id f(A a); static void f(A a); private: private: private: private: int x; int x; int x; int x;void A:f(A a)void A:f(A a)void A:f(A a)void A:f(A a) coutx; / coutx; / coutx; / coutx; /对对对对x x x x的引用是错误的的引用是错误的的引用是错误的的引用是错误的 couta.x; / couta.x; / couta.x; / couta.x; /正确正确正确正确 静态成员函数举例:静态成员函数举例: 访问非静态数访

37、问非静态数据成员必须通过据成员必须通过参数传递方式得参数传递方式得到对象名,然后到对象名,然后通过对象名访问通过对象名访问般战苇翔还泡霜勾栈裸僳浓顺搜勾揖惯嚼互倔坞否汛原香帛授棠厄茸梁农第5数据的共享和保护第5数据的共享和保护5.4 5.4 类的友元类的友元J友元是友元是C+C+提供的一种破坏数据封装和数提供的一种破坏数据封装和数据隐藏的机制据隐藏的机制C外界只能访问类的外界只能访问类的外界只能访问类的外界只能访问类的publicpublic成员,通过成员,通过成员,通过成员,通过friendfriend修饰符,将一个模块声明为另一个模块的友修饰符,将一个模块声明为另一个模块的友修饰符,将一个

38、模块声明为另一个模块的友修饰符,将一个模块声明为另一个模块的友元,则该友元能够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏元,则该友元能够引用到另一个模块中隐藏的信息的信息的信息的信息C可以使用友元函数和友元类可以使用友元函数和友元类可以使用友元函数和友元类可以使用友元函数和友元类C为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏为了确保数据的完整性,及数据封装与隐藏的原则,的原则,的原则,的原则,建议尽量不使用或少使用友元建议尽量不使用或少使用友元建议尽量不使用或少使用友元

39、建议尽量不使用或少使用友元来浚熙贼再拄玲雇徽桃点绍蛀度狸廖韩淋畜觉喜龚薯胀券惑啤肘畦察托颅第5数据的共享和保护第5数据的共享和保护友元函数友元函数J友元函数是在类声明中说明的非成员函数,友元函数是在类声明中说明的非成员函数,由关键字由关键字friendfriend修饰,该友元函数体中能修饰,该友元函数体中能够通过对象名访问够通过对象名访问 private private 和和 protectedprotected成员成员C作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择快

40、速性方面做合理选择快速性方面做合理选择快速性方面做合理选择C访问对象中的成员必须通过对象名访问对象中的成员必须通过对象名访问对象中的成员必须通过对象名访问对象中的成员必须通过对象名锻删冠是讽往弥之搬瞎迷怨剁播姓痘泰猿奋耿捏随孩羹削膝坛哨拍断刨溶第5数据的共享和保护第5数据的共享和保护使用友元函数计算两点距离使用友元函数计算两点距离#include #include #include #include iostreamiostreamiostream#include #include #include #include using namespace std;using namespace st

41、d;using namespace std;using namespace std;class Pointclass Pointclass Pointclass Point friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); friend float Distance(Point &a, Point &b); public:public:public:public:Point(int xx=

42、0, int yy=0) X=xx;Y=yy;Point(int xx=0, int yy=0) X=xx;Y=yy;Point(int xx=0, int yy=0) X=xx;Y=yy;Point(int xx=0, int yy=0) X=xx;Y=yy;int GetX() return X;int GetX() return X;int GetX() return X;int GetX() return X;int GetY() return Y;int GetY() return Y;int GetY() return Y;int GetY() return Y; private:

43、private:private:private:int X,Y;int X,Y;int X,Y;int X,Y;仕概书帜玛污也篆魔呼潍且录身骆迈害稠巷舰秩区痢蚊浚滞戒以逾彰弹糟第5数据的共享和保护第5数据的共享和保护double Distance( Point& a, Point& b)double Distance( Point& a, Point& b)double Distance( Point& a, Point& b)double Distance( Point& a, Point& b) double dx=a.X-b.X; double dx=a.X-b.X; double dx

44、=a.X-b.X; double dx=a.X-b.X; double dy=a.Y-b.Y; double dy=a.Y-b.Y; double dy=a.Y-b.Y; double dy=a.Y-b.Y; return return return return sqrtsqrtsqrtsqrt(dx*dx+dy*dy);(dx*dx+dy*dy);(dx*dx+dy*dy);(dx*dx+dy*dy); int main()int main()int main()int main() Point p1 Point p1 Point p1 Point p1(1,1), (1,1), (1,1

45、), (1,1), p2(p2(p2(p2(4,5)4,5)4,5)4,5); ; ; ; double d=Distance(p1, p2); double d=Distance(p1, p2); double d=Distance(p1, p2); double d=Distance(p1, p2); coutThe distance is dendl coutThe distance is dendl coutThe distance is dendl coutThe distance is dendl; ; ; ; return 0; return 0; return 0; retur

46、n 0; 简眷窗结头樟霓乘偶朗牺圃酚摘渣禹聂戎竖旱嘶瞳涎岸任扬屯站检戎狗舞第5数据的共享和保护第5数据的共享和保护友元类友元类J一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成一个类作为另一个类的友元,这个类的所有成员函数都是另一个类的友元函数员函数都是另一个类的友元函数员函数都是另一个类的友元函数员函数都是另一个类的友元函数J友元关系是友元关系是友元关系是友元关系是单向的、不可传递的单向的、不可传递的单向的、不可传递的单向的、不可传递的和和和和不可继承的不可继承的不可继承的不可继承的class X class X fri

47、end class Y;friend class Y; public: public: private: private: ;class Y class Y ; /则则则则Y Y Y Y中的所有成员函数都可引用中的所有成员函数都可引用中的所有成员函数都可引用中的所有成员函数都可引用X X X X中的任何成员中的任何成员中的任何成员中的任何成员浆衍毖县贝挝菏芜匿蒙郸长战吼解浊凝芜伺珐朔醒趟豺柄惭瘟燃膘随胡豪第5数据的共享和保护第5数据的共享和保护5.5 5.5 共享数据的保护共享数据的保护5.5.1 5.5.1 常对象常对象J常常类型的对象必须进行初始化,而且不能类型的对象必须进行初始化,而且不

48、能被更新被更新C常常常常对象:该对象的数据成员值在对象的整个对象:该对象的数据成员值在对象的整个对象:该对象的数据成员值在对象的整个对象:该对象的数据成员值在对象的整个生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化生存期间内不能被改变。即必须进行初始化, ,且不能被更新且不能被更新且不能被更新且不能被更新const const 类类类类名名名名 对象名对象名对象名对象名; ;C常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。常引用:被引用的对象不能被更新。const const

49、类型说明符类型说明符类型说明符类型说明符 & &引用名引用名引用名引用名缚趾拴撰钠王怪较古心赏吮就沈怂焰姿荒秒幅著桌卿蓖贸皿凋绥呻源卢璃第5数据的共享和保护第5数据的共享和保护常对象举例常对象举例class Aclass Aclass Aclass A public:public:public:public: A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; A(int i,int j) x=i; y=j; void set(int i,int j) x=i; y=j;void set(int

50、i,int j) x=i; y=j;void set(int i,int j) x=i; y=j;void set(int i,int j) x=i; y=j; void show()coutxyendl; void show()coutxyendl; void show()coutxyendl; void show()coutxyendl;privateprivateprivateprivate: : : : int x,y; int x,y; int x,y; int x,y;const A aconst A aconst A aconst A a(3,4);(3,4);(3,4);(3,

51、4); /a a a a是常对象,不能被是常对象,不能被是常对象,不能被是常对象,不能被更新更新更新更新a.set(5,7);a.set(5,7);a.set(5,7);a.set(5,7);/error/error/error/errora.show();a.show();a.show();a.show();/error/error/error/error脾蚤胡八否楞驴禽涟啃蛀乾卧歪狱灭镍献泻敢伐驶窿痪负辖枉促狸奏缚贫第5数据的共享和保护第5数据的共享和保护5.5.2 5.5.2 用用constconst修饰的类成员修饰的类成员J常成员函数:使用常成员函数:使用constconst关键字说明

52、的函数关键字说明的函数C常成员函数不更新对象的数据成员常成员函数不更新对象的数据成员常成员函数不更新对象的数据成员常成员函数不更新对象的数据成员C常对象只能常对象只能常对象只能常对象只能调用调用调用调用constconst常成员函数常成员函数常成员函数常成员函数C常成员函数说明格式:常成员函数说明格式:常成员函数说明格式:常成员函数说明格式:类型说明符类型说明符类型说明符类型说明符 函数名(参数表)函数名(参数表)函数名(参数表)函数名(参数表)const;const;这里,这里,这里,这里,constconst是函数类型的一个组成部分,因此是函数类型的一个组成部分,因此是函数类型的一个组成部

53、分,因此是函数类型的一个组成部分,因此在实现部分也要带在实现部分也要带在实现部分也要带在实现部分也要带constconst关键字。关键字。关键字。关键字。Cconstconst关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分如如如如void print(); void print(); 和和和和void print() const;void print() const;重载重载重载重载J常数据成员常数据成员C使用使用使用使用constconst说明的数据成员说明的数据成员说明的数据成员说明的数据成员

54、孔吩拧询烛荐痪赎呵沦凡醋胁叮何捡盟则襄系淋今却极吹领尹辈纶土央油第5数据的共享和保护第5数据的共享和保护例:常成员函数举例例:常成员函数举例#include#include#include#includeusing namespace std;using namespace std;using namespace std;using namespace std;class Rclass Rclass Rclass R public:public:public:public: R(int r1, int r2 R(int r1, int r2 R(int r1, int r2 R(int r1,

55、 int r2) ) ) ) R1=r1;R2=r2;R1=r1;R2=r2;R1=r1;R2=r2;R1=r1;R2=r2; void print();void print();void print();void print(); void print() const;void print() const;void print() const;void print() const;private:private:private:private: int R1,R2; int R1,R2; int R1,R2; int R1,R2;void R:print()void R:print()voi

56、d R:print()void R:print() coutR1:R2endl; coutR1:R2endl; coutR1:R2endl; coutR1:R2endl; void R:print() constvoid R:print() constvoid R:print() constvoid R:print() const coutR1;R2endl; coutR1;R2endl; coutR1;R2endl; coutR1;R2endl; int main()int main()int main()int main() R a(5,4);R a(5,4);R a(5,4);R a(5

57、,4); a.print() a.print() a.print() a.print();/;/;/;/调用调用调用调用void print()void print()void print()void print() const R b(20,52); const R b(20,52); const R b(20,52); const R b(20,52); b.print() b.print() b.print() b.print(); ; ; ; / / / /调用调用调用调用void void void void printprintprintprint() const() const(

58、) const() const return 0; return 0; return 0; return 0; 铺溜漓仔筛墩压鬃鹰豫毕淄冷啦笆巨腕划贤探滚顿型酱色码绎璃馒泪侩懦第5数据的共享和保护第5数据的共享和保护例:常数据成员举例例:常数据成员举例#include#include#include#includeusing namespace std;using namespace std;using namespace std;using namespace std;class Aclass Aclass Aclass A public:public:public:public:A(int

59、 i);A(int i);A(int i);A(int i);void print();void print();void print();void print();privateprivateprivateprivate: : : :const int a;const int a;const int a;const int a;static const static const static const static const int int int int b; b; b; b; ;const int A:b=10; const int A:b=10; const int A:b=10;

60、 const int A:b=10; A:A(int i):a(iA:A(int i):a(iA:A(int i):a(iA:A(int i):a(i) ) ) ) void A:print()void A:print()void A:print()void A:print() couta couta couta couta“:”b“:”b“:”b“:”bendl; endl; endl; endl; int main()int main()int main()int main() A A A A a1(100),a2(0); a1(100),a2(0); a1(100),a2(0); a1(

61、100),a2(0); a a a a1.print();1.print();1.print();1.print(); a a a a2.print();2.print();2.print();2.print(); 有悬诛哑节鞋脚所敬捧肿霄炼损并允奎叹誓轨骇凉敖艇雇汲管菇条沛二娇第5数据的共享和保护第5数据的共享和保护例:常引用作形参例:常引用作形参#include#include#include#includeiostreamiostreamiostreamusing namespace std;using namespace std;using namespace std;using na

62、mespace std;void display(const double& r);void display(const double& r);void display(const double& r);void display(const double& r);int main()int main()int main()int main() double d(9.5); double d(9.5); double d(9.5); double d(9.5); display(d); display(d); display(d); display(d); return 0; return 0;

63、 return 0; return 0; void display(void display(void display(void display(const double& rconst double& rconst double& rconst double& r) ) ) )/常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新常引用作形参,在函数中不能更新 r r r r所引用的对象。所引用的对象。所引用的对象。所引用的对象。 coutrendl; coutrendl; coutrendl; coutrendl; 堂土拭弧昼弱笛赢泌茸啼风吻氰严苫态妻

64、婆框肪赶翱反芭乖胯绳二枪弦锻第5数据的共享和保护第5数据的共享和保护5.6 5.6 多文件结构和编译预处理命令多文件结构和编译预处理命令J规模较大的项目规模较大的项目规模较大的项目规模较大的项目(project)(project)(project)(project)需要多个源程序文件需要多个源程序文件需要多个源程序文件需要多个源程序文件C C类的声明文件类的声明文件类的声明文件类的声明文件(*.h(*.h文件文件文件文件) )C C类的实现文件类的实现文件类的实现文件类的实现文件(*.cpp(*.cpp文件文件文件文件) )C C类的使用文件类的使用文件类的使用文件类的使用文件(*.cpp(*

65、.cpp文件,包含主函数文件,包含主函数文件,包含主函数文件,包含主函数) )J可以对不同的文件进行单独编写、编译可以对不同的文件进行单独编写、编译可以对不同的文件进行单独编写、编译可以对不同的文件进行单独编写、编译,再链接,再链接,再链接,再链接C C程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实程序的调试、修改时可以只对其中某一个类的声明和实现进行修改现进行修改现进行修改现进行修改J利用工程利用工程利用工程利用工程(workspace)(workspace)(workspace)(worksp

66、ace)来组合各个文件来组合各个文件来组合各个文件来组合各个文件J注意:模版的声明与定义必须写在同一个文件中注意:模版的声明与定义必须写在同一个文件中注意:模版的声明与定义必须写在同一个文件中注意:模版的声明与定义必须写在同一个文件中忱发址仟告颗免蜕古退躬喳谜谜袭尺剁类蛋归挟捷痉奶喊捌香羹恋钠危姬第5数据的共享和保护第5数据的共享和保护/Clock.h文件,文件,类的声明的声明class Clock private: int Hour, Minute, Second; public: void SetTime(int h=0,int m=0,s=0); void ShowTime();/Clo

67、ck.cpp,类的的实现#includeusing namespace std;#include Clock.hvoid Clock:SetTime(int h,int m,int s) Hour = h; Minute =m; Second =s; void Clock:ShowTime() cout Hour : Minute: Second; /prjClock.cpp,类的使用,类的使用#includeusing namespace std;#include Clock.hint main() Clock myClock; cout First Show:; myClock.SetTi

68、me(); myClock.ShowTime();return 0;输规互花迭瑟喂歉并慧瘁铀徘锅绅瓣压宗拌兜御红铂副群藉外蛀殃隔新良第5数据的共享和保护第5数据的共享和保护条件编译指令条件编译指令J在在在在多文件工程中,由于多文件工程中,由于多文件工程中,由于多文件工程中,由于#include#include#include#include指令的嵌套使指令的嵌套使指令的嵌套使指令的嵌套使用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的用,头文件可能被多次包含,编译时造成类的重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错重复定义等错误。条件编译指令可以避免该错误误误误C C如要被包含的程序段改写如下:如要被包含的程序段改写如下:如要被包含的程序段改写如下:如要被包含的程序段改写如下:#ifndef HEAD_H#ifndef HEAD_H #define HEAD_H #define HEAD_H 类定义类定义类定义类定义#endif#endif烛恍葫菇咬捅哩狼阀济募杯迹卸坪烙柠巡雁葬堡疫株喷快体抱线旬贩耽妥第5数据的共享和保护第5数据的共享和保护

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

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

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